2010-08-11 16 views
5

Non volevo davvero chiedere aiuto perché so che alla fine riuscirò a capirlo, ma ho passato troppo tempo, se il documento aveva tag principali o una struttura migliore, sarebbe un pezzo di torta. Purtroppo sto scaricando il documento e non riesco a capire come ottenere i dati.Selezione di un XElement da un XDocument

Ho provato alcune query linq e un foreach utilizzando XElement come iteratore. Comunque ecco un esempio della struttura.

<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:srch" xsi:schemaLocation="urn:yahoo:srch http://api.search.yahoo.com/SiteExplorerService/V1/InlinkDataResponse.xsd" totalResultsAvailable="247930100" firstResultPosition="99" totalResultsReturned="100"> 
<Result> 
    <Title>Adobe - Adobe Reader</Title> 
    <Url>http://get.adobe.com/fr/reader/</Url> 
    <ClickUrl>http://get.adobe.com/fr/reader/</ClickUrl> 
    </Result> 
<Result> 
    <Title>Religious Tolerance</Title> 
    <Url>http://www.religioustolerance.org/</Url> 
    <ClickUrl>http://www.religioustolerance.org/</ClickUrl> 
    </Result> 
<Result> 
    <Title>Applications Internet riches (RIA) | Adobe Flash Player</Title> 
    <Url>http://www.adobe.com/fr/products/flashplayer/</Url> 
    <ClickUrl>http://www.adobe.com/fr/products/flashplayer/</ClickUrl> 
    </Result> 
<Result> 
    <Title>photo management software | Adobe Photoshop Lightroom 3</Title> 
    <Url>http://www.adobe.com/products/photoshoplightroom/</Url> 
    <ClickUrl>http://www.adobe.com/products/photoshoplightroom/</ClickUrl> 
    </Result> 
<Result> 
    <Title>Battle for Wesnoth</Title> 
    <Url>http://www.wesnoth.org/</Url> 
    <ClickUrl>http://www.wesnoth.org/</ClickUrl> 
    </Result> 
</ResultSet> 

Ecco un esempio di ultimo frammento.

foreach (XElement ele in xDoc.Descendants("ResultSet").Elements("Result")) 
       { 
        CollectedUris.Add(ele.Element("Url").Value); 
       } 

risposta

8

Avrai bisogno di aggiungere un XNamespace:

XNamespace ns = "urn:yahoo:srch"; 

var query = xDoc.Root.Descendants(ns + "Result").Elements(ns + "Url") 

foreach(XElement e in query) 
{ 
    CollectedUris.Add(e.Value); 
} 

Edit:
Una soluzione LINQ per i punti bonus:

xDoc.Root.Descendants(ns + "Result") 
    .Elements(ns + "Url") 
    .Select(x => x.Value).ToList() 
    .ForEach(CollectedUris.Add); 
+0

Ah Non avevo idea dei namespace, sicuramente non l'avrei risolto senza l'aiuto di qualcuno, grazie! – Ash

2

sto supponendo che si desidera tutti<Url> elementi nel documento. Se è così, il tuo ciclo è quasi arrivato. Tu vorresti fare quanto segue.

using System.Xml.Linq; 

foreach (XElement ele in xDoc.Root.Descendants("Result").Descendants("Url") 
{ 
    CollectedUris.Add(ele.Value); 
} 

Root si ottiene un riferimento all'elemento radice, e la dichiarazione seguente Descendants restituisce solo i nodi <Result>. L'ultima dichiarazione Descendants limita ulteriormente l'enumeratore di nodi <Result> per restituire solo gli elementi <Url>.

+0

Grazie per l'esempio, ho aggiornato il codice XML struttura come non era leggibile. In ogni caso stranamente il metodo Add all'interno del ciclo non viene attivato (ottenuto un punto di interruzione). Puoi controllare la struttura e assicurarti che non stia facendo qualcosa di stupido. Grazie ancora – Ash

+1

@Ash - guarda la mia soluzione. Steve è corretto se non c'è uno spazio dei nomi, ma il tuo esempio richiede un gestore di namespace. –

Problemi correlati