2009-08-02 6 views
2

J'essaye d'analyser le XML renvoyé par l'API Youtue. Les appels API fonctionnent correctement et crée un XmlDocument. Je peux obtenir un XmlNodeList des balises « d'entrée », mais je ne suis pas sûr de savoir comment obtenir les éléments à l'intérieur tels que le,, etc ...Comment analyser le fichier XML dans C# (résultat youtube api)?

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 
} 

Le schéma du document XML est montré ici: http://code.google.com/apis/youtube/2.0/developers_guide_protocol_understanding_video_feeds.html

Je sais que node.Attributes est le mauvais appel, mais je ne suis pas sûr de ce que le bon est? A propos, s'il y a un meilleur moyen (plus rapide, moins de mémoire) de le faire en le sérialisant ou en utilisant linq, je serais heureux de l'utiliser à la place.

Merci pour toute aide!

Répondre

4

Voici quelques exemples de lecture de XmlDocument. Je ne sais pas ce qui est le plus rapide ou ce qui nécessite moins de mémoire - mais je préférerais Linq To Xml à cause de sa clarté.

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

et LINQ to XML un:

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

Merci! Cela l'éclaircit vraiment. – rksprst

0

Vous pouvez utiliser XSD.exe pour générer une classe basée sur le schéma fourni. Une fois généré, vous pouvez ensuite analyser la réponse XML dans la classe fortement typée.

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

Et la classe pour désérialisation il ...

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

Il y a aussi une autre façon here.

1

Je réalise que cela a été répondu et LINQ to XML est ce que j'irais avec, mais une autre option serait XPathNavigator. Quelque chose comme

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

while (xmlItr.MoveNext()) ... 

Le code est du haut de ma tête il peut se tromper et il peut y avoir une meilleure façon avec XPathNavigator mais il devrait vous donner l'idée générale

Questions connexes