/ / XML XDocument - Parece não haver elementos - c #, xml

XML XDocument - parece não haver elementos - c #, xml

Estou tentando entender o XDocument e seus vários métodos.

Eu tenho um mapa do site e estou tentando ler os URLs

<urlset xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<loc>http://www.site.co.uk/</loc>
</url>
<url>
<loc>http://www.site.co.uk/page</loc>
</url>
</urlset>

O procedimento acima analisa bem e estou tentando ler os valores de loc (os URLs da página), mas é aí que dá errado

        string siteMapText = String.Empty();
GetValueOfPageFromWebClient(SiteMapUrl, out siteMapText);

XDocument siteMap =
XDocument.Parse(siteMapText);

foreach (var loc in siteMap.Descendants())
{
//logic
}

No meu c #

loc.Element("loc").Value //should show value but doesn"t

Como eu itero sobre o loc valores?

EDITAR

De acordo com a resposta de Jon Skeet, tentei

Se eu fizer

  foreach (var loc in siteMap.Descendants("loc"))
{
//never enters
}

O mesmo acontece com

  foreach (var loc in siteMap.Descendants("url"))
{
//never enters
}

Eu tive que fazer foreach (var loc no siteMap.Descendants ()) { if (loc.Name.LocalName! = "url") continuar; //código }

Alguém pode explicar por que esse é o caso?

Respostas:

2 para resposta № 1

Como faço para percorrer os valores loc?

A maneira mais simples é usar a sobrecarga de Descendants que aceita um XName:

foreach (var loc in siteMap.Descendants("loc"))
{
string value = loc.Value;
...
}

Atualmente, você está solicitando o loc elemento dentro de cada elemento - mas nem o elemento raiz nem o elemento loc elementos contêm loc elementos filho, então Element retorna null, levando a uma exceção.

Agora parece que o XML não está "t na realidade como você mostrou na pergunta. Em vez disso, ele possui um espaço para nome padrão:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" ...>

Portanto, todos os elementos descendentes também estão nesse espaço para nome, porque eles não especificam mais nada ... então você precisa especificar o espaço para nome quando estiver procurando por coisas. Felizmente, isso é fácil:

XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9";
foreach (var loc in siteMap.Descendants(ns + "loc"))
{
...
}