2010-08-11 7 views
5

Je ne voulais vraiment pas demander de l'aide car je sais que je finirai par comprendre, mais j'ai passé trop de temps, si le document avait des étiquettes parents ou une meilleure structure, ce serait un morceau de gâteau. Malheureusement, je télécharge le document et je n'arrive pas à comprendre comment obtenir les données.Sélection d'un XElement à partir d'un XDocument

J'ai essayé quelques requêtes linq et un foreach en utilisant XElement comme itérateur. Quoi qu'il en soit, voici un exemple de la structure.

<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> 

Voici un exemple d'extrait le plus récent.

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

Répondre

8

Vous aurez besoin d'ajouter 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); 
} 

Modifier:
Une solution LINQ pour des points bonus:

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

Ah je n'avais aucune idée sur les espaces de noms, certainement ne l'aurais pas résolu sans l'aide de quelqu'un, merci! – Ash

2

Je suppose que vous voulez tous<Url> éléments du document. Si c'est le cas, votre boucle est presque là. Vous voulez faire ce qui suit.

using System.Xml.Linq; 

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

Root vous obtient une référence à l'élément racine, et la déclaration suivante Descendants renvoie uniquement les <Result> nœuds. La dernière instruction Descendants contraint en outre l'énumérateur de nœuds <Result> à renvoyer uniquement des éléments <Url>.

+0

Merci pour l'exemple, je l'ai mis à jour le xml structure car il n'était pas lisible. De toute façon bizarre la méthode Add dans la boucle n'est pas tirée (a obtenu un point de rupture dessus) Pourriez-vous vérifier la structure et assurez-vous que je ne fais pas quelque chose de stupide. Merci encore – Ash

+1

@Ash - voir ma solution. Steve est correct s'il n'y a pas d'espace de noms, mais votre exemple nécessite un gestionnaire d'espace de noms. –

Questions connexes