XML XDocument - 似乎没有元素

时间:2015-06-03 10:54:11

标签: c# xml

我试图理解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;)                 继续;            //码       }

有人可以解释为什么会这样吗?

1 个答案:

答案 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" ...>