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 № 1Como 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"))
{
...
}