通過解析XML元素我建設,需要通過XML飼料運行的應用程序,但我在與獲得某些元素有點麻煩。中的XmlReader
我使用的Twitter feed並希望通過所有<item>
元素運行。我可以很好地連接並從Feed中獲取內容,但我無法弄清楚如何通過reader.Read();
循環播放時只選擇item
元素。
感謝您的幫助!
通過解析XML元素我建設,需要通過XML飼料運行的應用程序,但我在與獲得某些元素有點麻煩。中的XmlReader
我使用的Twitter feed並希望通過所有<item>
元素運行。我可以很好地連接並從Feed中獲取內容,但我無法弄清楚如何通過reader.Read();
循環播放時只選擇item
元素。
感謝您的幫助!
最簡單的方法就是使用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);
}
一種替代方案:
// 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)
除非你有一個非常大的流,使得將內容加載到文檔中是不可取的,那麼這將是一個合理的方法,並且比使用XmlReader更具可讀性。 – AnthonyWJones 2008-10-28 12:31:49
有沒有你已經選擇了剛剛XML裝載到一個文檔一個XmlReader理由嗎?什麼框架版本? – AnthonyWJones 2008-10-28 12:32:43