使用LINQ to XML查询站点地图

时间:2014-02-01 19:38:54

标签: c# xml linq-to-xml sitemap

我有一个ASP.NET MVC网站。该网站的站点地图如下所示:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>http://www.mysite.com/contact</loc>
    <lastmod>2013-06-04</lastmod>
    <changefreq>never</changefreq>
  </url>
  <url>
    <loc>http://www.mysite.com/contact-us</loc>
    <lastmod>2013-06-04</lastmod>
    <changefreq>never</changefreq>
  </url>
  <url>
    <loc>http://www.mysite.com/about/books</loc>
    <lastmod>2013-06-18</lastmod>
    <changefreq>monthly</changefreq>
  </url>
  <url>
    <loc>http://www.mysite.com/about/blog</loc>
    <lastmod>2012-05-02</lastmod>
    <changefreq>never</changefreq>
  </url>
  <url>
    <loc>http://www.mysite.com/about/blog/post-1</loc>
    <lastmod>2012-05-02</lastmod>
    <changefreq>never</changefreq>
  </url>
  <url>
    <loc>http://www.mysite.com/about/blog/post-2</loc>
    <lastmod>2012-02-15</lastmod>
    <changefreq>never</changefreq>
  </url>
</urlset>

我正在尝试弄清楚如何使用C#中的Linq-to-XML查询此站点地图。我正在尝试编写一个只返回博客帖子条目的查询。博客帖子条目是其loc属性值以http://www.mysite.com/about/blog/开头的条目。目前,我正在成功加载和查询站点地图。但是,我无法弄清楚如何过滤到博客帖子,然后按lastmod值排序。这就是我到目前为止所做的:

XDocument sitemap = XDocument.Load(Server.MapPath("/resources/sitemap.xml"));
IEnumerable<XElement> blogs = from post in sitemap.Descendants("url")
                              select post;

如何过滤到我的博文?我对即使只是网址的查询似乎也没有起作用。

1 个答案:

答案 0 :(得分:4)

您的XML文档使用默认命名空间,因此您也必须在查询中使用它:

var ns = XNamespace.Get("http://www.sitemaps.org/schemas/sitemap/0.9");

IEnumerable<XElement> blogs = from post in sitemap.Root.Elements(ns + "url")
                              where ((string)post.Element(ns + "loc") ?? string.Empty).StartsWith("http://www.mysite.com/about/blog/")
                              select post;

我使用((string)post.Element(ns + "loc") ?? string.Empty)确保<loc>元素不存在时不会抛出任何异常,但如果您确定每个<url>中都有<loc>你可以用((string)post.Element(ns + "loc"))替换它。