2010-08-11 17 views
5

Ich wollte wirklich nicht um Hilfe bitten, da ich weiß, dass ich es irgendwann herausfinden werde, aber ich habe zu viel Zeit damit verbracht, wenn das Dokument Eltern-Tags oder eine bessere Struktur hatte, es wäre ein Stück Kuchen. Leider lade ich das Dokument herunter, und ich kann einfach nicht herausfinden, wie ich die Daten bekomme.Auswählen eines XElement von einem XDocument

Ich habe ein paar LINQ Abfragen und eine foreach mit XElement als Iterator versucht. Wie auch immer, hier ist ein Beispiel für die Struktur.

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

Hier ist ein Beispiel für ein neues Snippet.

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

Antwort

8

Sie müssen hinzufügen eine 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); 
} 

bearbeiten:
Eine LINQ-Lösung für Bonuspunkte:

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

Ah ich hatte keine Ahnung von Namespaces, hätte es bestimmt nicht ohne jemandes Hilfe gelöst, danke! – Ash

2

Ich nehme an, Sie wollen, dass alle <Url> Elemente in dem Dokument. Wenn das der Fall ist, dann ist deine Schleife fast da. Sie werden Folgendes tun wollen.

using System.Xml.Linq; 

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

Root bekommt man einen Verweis auf das Wurzelelement und die folgende Descendants Anweisung gibt nur die <Result> Knoten. Die letzte Descendants-Anweisung zwingt weiter den <Result> Knoten-Enumerator, nur <Url> Elemente zurückzugeben.

+0

Danke für das Beispiel habe ich die XML aktualisiert haben Struktur, wie es nicht lesbar war. Wie auch immer, seltsamerweise wird die Add-Methode innerhalb der Schleife nicht ausgelöst (habe einen Unterbrechungspunkt). Könntest du die Struktur überprüfen und sicherstellen, dass ich nichts Dummes mache? Danke nochmal – Ash

+1

@Ash - siehe meine Lösung. Steve's ist korrekt, wenn es keinen Namespace gibt, aber Ihr Beispiel benötigt einen Namespace-Manager. –