2014-02-01 5 views
0

У меня есть веб-сайт ASP.NET MVC. Этот сайт имеет карту сайта, которая выглядит следующим образом:Запрос файла Sitemap с LINQ to XML

<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> 

Я пытаюсь выяснить, как запросить эту карту сайта с Linq к XML в C#. Я пытаюсь написать запрос, который возвращает только записи в блоге. Записи в блоге - те, чье значение атрибута логарифма начинается с 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; 

Как отфильтровать до моих сообщений в блоге? Мой запрос даже для URL-адресов, похоже, не работает.

ответ

2

Ваш 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")).