2008-10-28 68 views
2

通過解析XML元素我建設,需要通過XML飼料運行的應用程序,但我在與獲得某些元素有點麻煩。中的XmlReader

我使用的Twitter feed並希望通過所有<item>元素運行。我可以很好地連接並從Feed中獲取內容,但我無法弄清楚如何通過reader.Read();循環播放時只選擇item元素。

感謝您的幫助!

+0

有沒有你已經選擇了剛剛XML裝載到一個文檔一個XmlReader理由嗎?什麼框架版本? – 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); 
} 

我不知道如果這個代碼是慢或不好的做法。 請做評論。

我發現它比使用導航和Iterator另一個更具可讀性。

編輯:我使用Xml文檔。一個的XPath文檔作爲Vinko Vrsalovic的回答不支持這種工作方式,而且是快了很多: (MSDN)

+0

除非你有一個非常大的流,使得將內容加載到文檔中是不可取的,那麼這將是一個合理的方法,並且比使用XmlReader更具可讀性。 – AnthonyWJones 2008-10-28 12:31:49