2009-08-02 3 views
2

Ich versuche, XML aus der Youtue-API zu analysieren. Die API-Aufrufe funktionieren ordnungsgemäß und erstellen ein XmlDocument. Ich kann einen XmlNodeList des „Eintrag“ Tags bekommen, aber ich bin nicht sicher, wie die Elemente innerhalb so zu erhalten, wie die, usw ...Wie parsen Sie XML-Datei in C# (youtube api Ergebnis)?

XmlDocument xmlDoc = youtubeService.GetSearchResults(search.Term, "published", 1, 50); 
XmlNodeList listNodes = xmlDoc.GetElementsByTagName("entry"); 
foreach (XmlNode node in listNodes) 
{ 
    //not sure how to get elements in here 
} 

Das XML-Dokument Schema hier gezeigt wird: http://code.google.com/apis/youtube/2.0/developers_guide_protocol_understanding_video_feeds.html

Ich weiß, dass node.Attributes der falsche Anruf ist, aber ich bin mir nicht sicher, was der richtige ist?

Übrigens, wenn es einen besseren Weg (schneller, weniger Speicher) gibt, um dies zu tun, indem Sie es serialisieren oder linq verwenden, würde ich mich freuen, das stattdessen zu verwenden.

Danke für jede Hilfe!

Antwort

4

Hier einige Beispiele, die das XmlDocument lesen. Ich weiß nicht, was am schnellsten ist oder was weniger Speicher braucht - aber ich würde Linq To Xml wegen seiner Klarheit bevorzugen.

XmlDocument xmlDoc = youtubeService.GetSearchResults(search.Term, "published", 1, 50); 
XmlNodeList listNodes = xmlDoc.GetElementsByTagName("entry"); 
foreach (XmlNode node in listNodes) 
{ 
    // get child nodes 
    foreach (XmlNode childNode in node.ChildNodes) 
    { 
    } 

    // get specific child nodes 
    XPathNavigator navigator = node.CreateNavigator(); 
    XPathNodeIterator iterator = navigator.Select(/* xpath selector according to the elements/attributes you need */); 

    while (iterator.MoveNext()) 
    { 
     // f.e. iterator.Current.GetAttribute(), iterator.Current.Name and iterator.Current.Value available here 
    } 
} 

und die LINQ to XML ein:

XmlDocument xmlDoc = youtubeService.GetSearchResults(search.Term, "published", 1, 50); 
XDocument xDoc = XDocument.Parse(xmlDoc.OuterXml); 
var entries = from entry in xDoc.Descendants("entry") 
       select new 
       { 
        Id = entry.Element("id").Value, 
        Categories = entry.Elements("category").Select(c => c.Value) 
       }; 

foreach (var entry in entries) 
{ 
    // entry.Id and entry.Categories available here 
} 
+0

Dank geben! Das macht es wirklich klar. – rksprst

0

könnten Sie XSD.exe verwenden, um eine Klasse zu generieren basierend, die auf dem Schema. Nach der Generierung können Sie die XML-Antwort in die stark typisierte Klasse zerlegen.

string xmlResponse = GetMyYouTubeStuff(); 
MyYouTubeClass response = null; 
XmlHelper<MyYouTubeClass> xmlHelper = new XmlHelper<MyYouTubeClass>(); 
response = xmlHelper.Deserialize(xmlResponse); 

Und die Klasse für Deserialisieren es ...

public class XmlHelper<T> 
{ 
public T Deserialize(string xml) 
    { 
    XmlSerializer xs = new XmlSerializer(typeof(T)); 

    Byte[] byteArray = new UTF8Encoding().GetBytes(xml); 
    MemoryStream memoryStream = new MemoryStream(byteArray); 

    XmlTextReader xmlTextReader = new XmlTextReader(memoryStream); 

    T retObj = (T)xs.Deserialize(xmlTextReader); 

    return retObj; 
    } 
} 

Es gibt auch eine andere Art und Weise here.

1

Ich weiß, dass dies beantwortet wurde und LINQ zu XML ist, was ich mit gehen würde, aber eine andere Option wäre XPathNavigator. So etwas wie

 
XPathNavigator xmlNav = xmlDoc.CreateNavigator(); 
XPathNodeIterator xmlitr = xmlNav.Select("/XPath/expression/here") 

while (xmlItr.MoveNext()) ... 

Der Code ist aus der Spitze von meinem Kopf, so dass es falsch sein kann, und es kann eine bessere Art und Weise mit XPathNavigator sein, aber es sollte Ihnen die allgemeine Idee

Verwandte Themen