2012-03-10 4 views
0

Привет I'am пытаются читать 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"; 

Хотя, если бы я тебя, я хотел бы использовать более описательный префикс, как atom или a.

+0

Thaks Я понимаю, поэтому представьте себе, если мне нужно, чтобы получить категорию тега, если добавить mgr.AddNamespace ("Digg", «HTTP: // Digg. com/docs/diggrss/"), как я отношусь к категории!?!? – mastervv

+0

Да, точно. Чтобы получить доступ к тегу, вы можете использовать XPath, например '/ ns: feed/ns: entry/digg: ​​category'. – svick

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

You Rock, с Linq 2 xml его более легко сделать – mastervv

Смежные вопросы