2008-10-28 5 views
2

Я создаю приложение, которое должно запускаться через фид XML, но у меня возникают небольшие проблемы с получением определенных элементов.Анализ XML-элементов в XmlReader

Я использую Twitter feed и хочу пропустить все элементы <item>. Я могу подключиться отлично и получить контент из фида, но я не могу понять, как выбрать только элементы item, когда я перехожу через reader.Read();.

Благодарим за помощь!

+0

Есть ли причина, вы выбрали в XmlReader за только загрузку XML в документ? Какая версия рамки? – AnthonyWJones 2008-10-28 12:32:43

ответ

5

Самый простой способ сделать это - использовать XPath. Пример для подражания.

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(); 

И это подход Ян работает

 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

Альтернативу:

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

Я не знаю, если этот код медленнее или плохая практика. Прокомментируйте.

Я нахожу его более читаемым, чем другой, используя Navigator и Iterator.

Редактировать: Я использую Xml Документ. XPath Документ, как в ответ Винко Vrsalovic «s не поддерживает такой способ работы, но это намного быстрее: (MSDN)

+0

Если у вас очень большой поток, который делает загрузку содержимого в документ нежелательным, это будет разумным подходом и гораздо более читаемым, чем использование XmlReader. – AnthonyWJones 2008-10-28 12:31:49