2010-05-11 9 views
3

У меня есть запрос Linq-2-XML, который не будет работать, если созданная мной карта сайта google имеет свой urlset-элемент, заполненный атрибутами, но будет работать нормально, если нет атрибутов настоящее время.Проблемы с запросом google sitemap.xml с Linq to XML

Не можете запросить:

<?xml version="1.0" encoding="utf-8"?> 
<urlset 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" 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
<url> 
    <loc>http://www.foo.com/index.htm</loc> 
    <lastmod>2010-05-11</lastmod> 
    <changefreq>monthly</changefreq> 
    <priority>1.0</priority> 
</url> 
<url> 
    <loc>http://www.foo.com/about.htm</loc> 
    <lastmod>2010-05-11</lastmod> 
    <changefreq>monthly</changefreq> 
    <priority>1.0</priority> 
</url> 
</urlset> 

Может запрос:

<?xml version="1.0" encoding="utf-8"?> 
<urlset> 
<url> 
    <loc>http://www.foo.com/index.htm</loc> 
    <lastmod>2010-05-11</lastmod> 
    <changefreq>monthly</changefreq> 
    <priority>1.0</priority> 
</url> 
<url> 
    <loc>http://www.foo.com/about.htm</loc> 
    <lastmod>2010-05-11</lastmod> 
    <changefreq>monthly</changefreq> 
    <priority>1.0</priority> 
</url> 
</urlset> 

запрос:

XDocument xDoc = XDocument.Load(@"C:\Test\sitemap.xml"); 
var sitemapUrls = (from l in xDoc.Descendants("url") 
          select l.Element("loc").Value); 
foreach (var item in sitemapUrls) 
{  
    Console.WriteLine(item.ToString()); 
} 

Что бы быть причиной этого?

ответ

7

См. "Xmlns =" ​​тег в XML? Вам нужно указать пространство имен. Протестируйте следующую модификацию кода:

XDocument xDoc = XDocument.Load(@"C:\Test\sitemap.xml"); 
XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9"; 

var sitemapUrls = (from l in xDoc.Descendants(ns + "url") 
        select l.Element(ns + "loc").Value); 
foreach (var item in sitemapUrls) 
{ 
    Console.WriteLine(item.ToString()); 
} 
+0

@ Энтони - да, это работает благодаря. Не знал, что вы должны использовать пространство имен, если оно указано. –