2008-10-28 8 views
2

Je suis en train de créer une application qui doit passer par un flux XML, mais j'ai quelques difficultés à obtenir certains éléments. J'utilise le Twitter feed et je veux parcourir tous les éléments <item>. Je peux me connecter correctement et obtenir le contenu du flux, mais je n'arrive pas à comprendre comment sélectionner uniquement les éléments item lorsque je fais une boucle sur reader.Read();.Analyse d'éléments XML dans XmlReader

Merci pour votre aide!

+0

Y at-il une raison que vous avez choisi un XmlReader sur le chargement de tout le XML dans un document? Quelle version du framework? – AnthonyWJones

Répondre

5

La méthode la plus simple consiste à utiliser XPath. Exemple à suivre

string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?> 
<rss version=""2.0""> 
    <channel> 
    <title>Twitter public timeline</title> 
    <link>http://twitter.com/public_timeline</link> 
    <description>Twitter updates from everyone!</description> 
    <language>en-us</language> 
    <ttl>40</ttl> 

    <item> 
     <title>yasu_kobayashi: rTwT: @junm : yayaya</title> 
     <description>yasu_kobayashi: rTwT: @junm : yayaya</description> 
     <pubDate>Tue, 28 Oct 2008 12:04:48 +0000</pubDate> 
     <guid>http://twitter.com/yasu_kobayashi/statuses/978829930</guid> 
     <link>http://twitter.com/yasu_kobayashi/statuses/978829930</link> 

    </item><item> 
     <title>FreeGroup: WikiFortio - foobar http://tinyurl.com/5gvttf</title> 
     <description>FreeGroup: WikiFortio - foobar 
     http://tinyurl.com/5gvttf</description> 
     <pubDate>Tue, 28 Oct 2008 12:04:47 +0000</pubDate> 
     <guid>http://twitter.com/FreeGroup/statuses/978829929</guid> 
     <link>http://twitter.com/FreeGroup/statuses/978829929</link> 

    </item></channel></rss> 
     "; 
      XPathDocument doc = new XPathDocument(new StringReader(xml)); 
      XPathNavigator nav = doc.CreateNavigator(); 

      // Compile a standard XPath expression 

      XPathExpression expr; 
      expr = nav.Compile("/rss/channel/item"); 
      XPathNodeIterator iterator = nav.Select(expr); 

      // Iterate on the node set 

      try 
      { 
       while (iterator.MoveNext()) 
       { 
        XPathNavigator nav2 = iterator.Current.Clone(); 
        nav2.MoveToChild("title",""); 
        Console.WriteLine(nav2.Value); 
        nav2.MoveToParent(); 
        nav2.MoveToChild("pubDate",""); 
        Console.WriteLine(nav2.Value); 

       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
      Console.ReadKey(); 

C'est l'approche de Jan travail

 XmlDocument doc2 = new XmlDocument(); 
     doc2.LoadXml(xml); 
     XmlNode root = doc2.DocumentElement; 

     foreach (XmlNode item in root.SelectNodes(@"/rss/channel/item")) 
     { 
      Console.WriteLine(item.SelectSingleNode("title").FirstChild.Value); 
      Console.WriteLine(item.SelectSingleNode("pubDate").FirstChild.Value); 
     } 
5

Une alternative:

// starts as in Vinko Vrsalovic 's answer 
// and not including decent eror handling 
XmlDocument doc = new XmlDocument(new StringReader(xml)); 

foreach (XmlNode item in doc.SelectNodes(@"/rss/channel/item")) 
{ 
    Console.WriteLine(item.SelectSingleNode("title").Value); 
    Console.WriteLine(item.SelectSingleNode("pubDate").Value); 
} 

Je ne sais pas si ce code est une pratique plus lent ou mauvais. S'il vous plaît commenter. Je le trouve plus lisible que l'autre en utilisant Navigator et Iterator.

Édition: J'utilise un Xml Document. Un XPath document comme dans la réponse de Vinko Vrsalovic ne supporte pas cette façon de travailler, mais est beaucoup plus rapide: (MSDN)

+0

Sauf si vous avez un très grand flux qui rend le chargement du contenu dans un document indésirable, alors ce serait une approche raisonnable et beaucoup plus lisible que d'utiliser un XmlReader. – AnthonyWJones

+0

J'aime cette approche aussi. Mais vous ne pouvez pas l'utiliser avec un XPathDocument, vous avez besoin d'un XmlNode –

+0

Mon erreur! Je voulais dire XmlDocument. Mais comme je peux imaginer un flux rss Twitter devenir très grand, j'irais - dans ce cas - pour une implémentation en utilisant XPathDocument aussi. – jan