我有一个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;
如何过滤到我的博文?我对即使只是网址的查询似乎也没有起作用。
答案 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"))
替换它。