如何反序列化Google新闻站点地图Feed c#

时间:2016-11-07 13:10:10

标签: c# xml rss sitemap

我有Google新闻站点地图Feed,但我无法在c#list collection上反序列化xml。

我想从我的Feed中获得前50个项目。

我能为此做些什么?任何的想法 ?感谢

我的xml样本是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://www.hellenicshippingnews.com/wp-content/plugins/xml-sitemap-feed/includes/xsl/sitemap-news.xsl?ver=4.7.3"?>
<!-- generated-on="2016-11-07T12:40:55+00:00" -->
<!-- generator="XML & Google News Sitemap Feed plugin for WordPress" -->
<!-- generator-url="http://status301.net/wordpress-plugins/xml-sitemap-feed/" -->
<!-- generator-version="4.7.3" -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" 
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
    http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
    http://www.google.com/schemas/sitemap-news/0.9
    http://www.google.com/schemas/sitemap-news/0.9/sitemap-news.xsd
    http://www.google.com/schemas/sitemap-image/1.1
    http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd">
<url>
    <loc>http://www.hellenicshippingnews.com/odc-to-convert-fifth-greek-vessel-olympic-target/</loc>
    <news:news>
        <news:publication>
            <news:name>Hellenic Shipping News Worldwide</news:name>
            <news:language>en</news:language>
        </news:publication>
        <news:publication_date>2016-11-07T10:00:57+00:00</news:publication_date>
        <news:title>ODC to convert fifth Greek vessel Olympic Target</news:title>
        <news:keywords>Hellenic Shipping News, ΒunkerportsnewsΠρώτηΣελιδα, Πρώτη σελιδα</news:keywords>
    </news:news>
    <image:image>
        <image:loc>http://www.hellenicshippingnews.com/wp-content/uploads/2015/10/double-hulled_oil_tanker.jpg</image:loc>
        <image:title><![CDATA[double-hulled_oil_tanker]]></image:title>
    </image:image>
</url>
</urlset>

我尝试使用这个c#代码但没有发生任何事情:

XDocument feedXML = XDocument.Load("http://www.hellenicshippingnews.com/sitemap-news.xml");

        var feeds = from feed in feedXML.Descendants("url")
                    select new
                    {
                        Title = feed.Element("loc").Value,
                        Link = feed.Element("news:title").Value,
                        Description = feed.Element("news:keywords").Value
                    };

1 个答案:

答案 0 :(得分:1)

您忘记了命名空间(请参阅xmlns根元素周围的urlset属性。)

此外,您应该使用Descendants方法而不是Element

请参阅下面的黑色注释:

根据文档Element

  

获取具有指定XName的第一个(按文档顺序)子元素

而且,Descendants

  

按文档顺序返回此文档或元素的后代元素的集合。

子元素被视为父元素的直接内部节点。 titlekeywords不是url的子节点,因此您应该使用Descendants方法在节点层次结构中进行更深入的搜索。

string ns = "http://www.sitemaps.org/schemas/sitemap/0.9";
string news_ns = "http://www.google.com/schemas/sitemap-news/0.9";
var feeds = from feed in feedXML.Descendants(String.Format("{{{0}}}{1}", ns, "url"))
            select new
            {
                Title = feed.Element(String.Format("{{{0}}}{1}", ns, "loc")).Value,
                Link = feed.Descendants(String.Format("{{{0}}}{1}", news_ns, "title")).Single().Value,
                Description = feed.Descendants(String.Format("{{{0}}}{1}", news_ns, "keywords")).Single().Value
            };