【问题标题】:Read Complex Rss feed阅读复杂的 Rss 提要
【发布时间】:2012-03-10 13:47:27
【问题描述】:

嗨,我正在尝试阅读 digg 提要,但我的代码没有从 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>

谢谢

【问题讨论】:

    标签: c# xml xpath rss xml-namespaces


    【解决方案1】:

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

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

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

    【讨论】:

    • 我明白了,所以想象一下如果我需要获取类别标签,如果添加 mgr.AddNamespace("digg", "digg.com/docs/diggrss/"),我如何访问该类别!?!?
    • 是的,完全正确。要访问标签,您可以使用 XPath,例如 /ns:feed/ns:entry/digg:category
    【解决方案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();
    

    【讨论】:

    • You Rock,使用 Linq 2 xml 更容易做到
    猜你喜欢
    • 2010-10-04
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多