阅读复杂的RSS订阅

问题描述:

你好我'尝试读取Digg的饲料,但我的代码犯规无法返回RSS的任何项目,我觉得命名空间是问题阅读复杂的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(); 

我什么狗狗错了!?!?其他Problema,我已经是如何在不同的命名空间

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

Thaks

当你调用mgr.AddNamespace("ns", "http://www.w3.org/2005/Atom"),它定义了命名空间前缀ns,然后你就可以在你的XPath查询使用获得该代码。 但是你必须真正使用它:

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

虽然如果我是你,我会用一个更具描述性的前缀,如​​或a

+0

Thaks我明白,所以想象一下,如果我需要在类别标记,如果加上mgr.AddNamespace( “挖掘” 的解决方案,“HTTP:// Digg的。 com/docs/diggrss /“),我如何访问该类别!?!? – mastervv 2012-03-10 14:37:20

+0

是的,确切地说。要访问标签,可以使用像'/ ns:feed/ns:entry/digg:category'这样的XPath。 – svick 2012-03-10 14:46:29

下面是使用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(); 
+0

你摇滚,与Linq 2 xml更容易做到 – mastervv 2012-03-10 14:33:38