阅读Complex Rss feed

时间:2012-03-10 13:47:28

标签: c# xml xpath rss xml-namespaces

您好我尝试阅读digg feed,但我的代码不会从RSS返回任何项目,我认为命名空间是问题

<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:digg="http://digg.com/docs/diggrss/" xmlns:media="http://search.yahoo.com/mrss/">
<title>Top News</title>
<subtitle>Top News</subtitle>
<updated>2012-03-10T13:27:08Z</updated>
<link href="http://services.digg.com/2.0/story.getTopNews?type=rss" rel="self"/>
<id>http://services.digg.com/2.0/story.getTopNews?type=rss</id>
<link href="http://pubsubhubbub.appspot.com/" rel="hub"/>
<author>
<name>Digg</name>
</author>
<entry>
<title>The Windows 8 Power Struggle: Metro vs Desktop and Why They Don't Mesh Well</title>
<link href="http://digg.com/news/technology/the_windows_8_power_struggle_metro_vs_desktop_and_why_they_don_t_mesh_well?utm_campaign=Feed%3A+http%3A%2F%2Fservices.digg.com%2F2.0%2Fstory.getTopNews%3Ftype%3Drss&amp;utm_medium=feed&amp;utm_source=diggapi"/>
<content type="html">Metro, Microsoft's new UI, is bold, a dramatic departure from anything the company has previously done in the desktop/laptop space, and absolutely great. It's tangible proof that Redmond really can design and build its own unique products and experiences. However, the transition from Metro's start, for desktop users, is jarring and worse yet, Desktop mode and Metro don't mesh well at all..</content>
<updated>2012-03-09T17:12:03Z</updated>
<digg:diggCount>
92
</digg:diggCount>
<digg:category>
Technology
</digg:category>
<digg:commentCount>
3
</digg:commentCount>
<media:thumbnail height="62" url="http://cdn1.diggstatic.com/story/the_windows_8_power_struggle_metro_vs_desktop_and_why_they_don_t_mesh_well/t.png" width="62"/>
<media:group>
<media:content height="160" url="http://cdn3.diggstatic.com/story/the_windows_8_power_struggle_metro_vs_desktop_and_why_they_don_t_mesh_well/l.png" width="160"/>
<media:content height="48" url="http://cdn1.diggstatic.com/story/the_windows_8_power_struggle_metro_vs_desktop_and_why_they_don_t_mesh_well/s.png" width="48"/>
<media:content height="120" url="http://cdn1.diggstatic.com/story/the_windows_8_power_struggle_metro_vs_desktop_and_why_they_don_t_mesh_well/m.png" width="120"/>
<media:content height="62" url="http://cdn1.diggstatic.com/story/the_windows_8_power_struggle_metro_vs_desktop_and_why_they_don_t_mesh_well/t.png" width="62"/>
</media:group>
<id>http://digg.com/news/technology/the_windows_8_power_struggle_metro_vs_desktop_and_why_they_don_t_mesh_well</id>
</entry>

使用此代码示例

  var xmlPath = "/feed/entry";


    var xmlDoc = new XmlDocument();
    var webClient = new WebClient();
    var stream = new MemoryStream(webClient.DownloadData("http://services.digg.com/2.0/story.getTopNews?type=rss"));
    xmlDoc.Load(stream);


    var mgr = new XmlNamespaceManager(xmlDoc.NameTable);
    mgr.AddNamespace("ns", "http://www.w3.org/2005/Atom");


    XmlNodeList xmlNode = xmlDoc.SelectNodes(xmlPath, mgr);

    int count = xmlNode.Count;

    Console.WriteLine("Count : "+count);

    //Console.WriteLine(xmlNode.Name + ": " + xmlNode.InnerText);
    Console.ReadKey();

我错了什么!?!?其他问题我是如何在不同的命名空间中获取此标记

<digg:category>
Technology
</digg:category>

Thaks

2 个答案:

答案 0 :(得分:2)

当您调用mgr.AddNamespace("ns", "http://www.w3.org/2005/Atom")时,它会定义名称空间前缀ns,然后您可以在XPath查询中使用它。 但你必须实际使用它:

var xmlPath = "/ns:feed/ns:entry";

虽然如果我是你,我会使用更具描述性的前缀,例如atoma

答案 1 :(得分:2)

这是使用Linq 2 xml的解决方案

XDocument xDoc = XDocument.Load(new StringReader(xml));
XNamespace atom = XNamespace.Get("http://www.w3.org/2005/Atom");
XNamespace digg = XNamespace.Get("http://digg.com/docs/diggrss/");
XNamespace media = XNamespace.Get("http://search.yahoo.com/mrss/");

var items = xDoc
            .Descendants(atom + "entry")
            .Select(x => new
            {
                Title = x.Element(atom + "title").Value,
                Link = x.Element(atom + "link").Attribute("href").Value,
                Category = x.Element(digg+"category").Value.Trim(),
                Thumbnail = x.Element(media+"thumbnail").Attribute("url").Value
            })
            .ToArray();