我试图理解XDocument及其各种方法。
我有一个站点地图,我正在尝试阅读这些网址
<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>
以上解析很好,我试图读取loc的值(页面URL),但这是错误的
string siteMapText = String.Empty();
GetValueOfPageFromWebClient(SiteMapUrl, out siteMapText);
XDocument siteMap =
XDocument.Parse(siteMapText);
foreach (var loc in siteMap.Descendants())
{
//logic
}
在我的C#中
loc.Element("loc").Value //should show value but doesn't
如何迭代loc
值?
修改
根据Jon Skeet的回答,我试过
如果我这样做
foreach (var loc in siteMap.Descendants("loc"))
{
//never enters
}
也是如此
foreach (var loc in siteMap.Descendants("url"))
{
//never enters
}
我必须这样做 foreach(siteMap.Descendants()中的var loc) { if(loc.Name.LocalName!=&#34; url&#34;) 继续; //码 }
有人可以解释为什么会这样吗?
答案 0 :(得分:3)
如何迭代loc值?
最简单的方法是使用接受Descendants
的{{1}}重载:
XName
目前,您要求每个元素中包含foreach (var loc in siteMap.Descendants("loc"))
{
string value = loc.Value;
...
}
元素 - 但根元素和loc
元素都不包含loc
个子元素,因此loc
会返回Element
,导致异常。
现在看来XML并不是实际上,因为你已经将它显示在问题中。相反,它有一个默认命名空间:
null
因此所有后代元素也都在该命名空间中,因为它们没有指定任何其他内容......因此您需要在查找内容时指定命名空间。幸运的是,这很简单:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" ...>