Читать комплексный RSS-канал - PullRequest
0 голосов
/ 10 марта 2012

Привет, я пытаюсь прочитать ленту 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>

Thaks

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Вот решение с использованием 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();
2 голосов
/ 10 марта 2012

Когда вы вызываете mgr.AddNamespace("ns", "http://www.w3.org/2005/Atom"), он определяет префикс пространства имен ns, который вы затем можете использовать в своем запросе XPath. Но вы должны его использовать:

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

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

...