2017-03-27 4 views
0

Es scheint wie eine sehr einfache Aufgabe, und ich frage mich, ob ich die falschen Begriffe verwenden, da ich keine Lösung für diese zu finden ...Parsing verschachtelte XML

Ich habe eine sehr einfache, verschachtelte XML:

<books> 
    <book> 
     <author>Douglas Adams</author> 
     <title>The Hitch Hikers Guide to the Galaxy</title> 
     <price>42</price> 
    </book> 
</books> 

ich bin der Web-API des XML-Inhalt zurück in einen Strom, endend mit dem oben eingefügten Inhalt in den variablen xmlStream zu erhalten:

var xmlStream = response.Content.ReadAsStreamAsync().Result; 
var xmlDocument = new XmlDocument(); 

xmlDocument.Load(xmlStream); 

Console.WriteLine("Title:"); 
// Do something to get the value of 'title' 
Console.WriteLine(xmlDocument.someTraversion...); 

Da ich nicht mit XML muc gearbeitet h Ich bin nicht sicher, wie man in das Titelattribut übergeht.

Ich lese über XPath und versuche zu verstehen, wie zu navigate the DOM tree. Ich fürchte, ich bekomme nicht die Terminologie nodes, child. Jede Hilfe wird sehr geschätzt :-)

+0

Ich bin nicht dagegen sein downvoted aber würde gerne einen Kommentar darüber, was in meiner Frage zu verbessern :-) – jrn

+1

Was Terminologie, ein "Child" wäre ein Element, das in einem anderen Element ist. In diesem Fall ist "Autor" ein Kind von "Book", das ein Kind von "Books" ist. Aus Sicht der Bücher ist "Autor" kein Kind, sondern ein Ahnherr. Ein "Knoten" ist ein beliebiger syntaktischer Teil des XML, das gesamte Dokument ist ein Knoten, ein einzelnes Element ist ein Knoten, ein Attribut ist ein Knoten usw. –

+0

Vielen Dank @BradleyUffner! Das macht jetzt mehr Sinn :-) – jrn

Antwort

1

Verwenden LINQ of XML

XElement document = null; 
using (var stream = await response.Content.ReadAsStreamAsync()) 
{ 
    document = XElement.Load(stream); 
} 

foreach(var book in document.Descendants("book")) 
{ 
    var title = book.Element("title").Value; 
    // use title 
} 

Beachten Sie, dass ReadAsStreamAsync().Result mit möglicherweise einen Deadlock Fehler werfen kann - verwenden „richtige“ erwarten Ansatz

var result = await ReadAsStreamAsync(); 
+0

Vielen Dank für Ihre Hilfe Fabio! Ich bekomme folgende Fehlermeldung: 'XmlElement' enthält keine Definition für 'Load' – jrn

+0

' XDocument' und 'XElement' sollen' XmlDocument' und 'XmlElement' sein, oder? – jrn

+1

@jrn, nein. XDocument ist eine Klasse aus System.Xml.Linq. – Fabio