2012-03-10 132 views
0

你好我'嘗試讀取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

回答

2

當你調用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

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(); 
+0

你搖滾,與Linq 2 xml更容易做到 – mastervv 2012-03-10 14:33:38