LINQ to XML节点选择无法按预期工作

时间:2012-11-02 13:12:19

标签: c# linq linq-to-xml

  

可能重复:
  Understanding Linq To Xml - Descendants return no results

所以我一直在看微软的例子:

http://msdn.microsoft.com/en-us/library/bb387061.aspx

在那里,他们喜欢这样:

IEnumerable<string> partNos =
from item in purchaseOrder.Descendants("Item")
select (string) item.Attribute("PartNumber");

他们使用“Descendants”来解决purchaseOrder中实际上有3个级别的项目。

现在,当我尝试用我的XML做同样的事情时,我什么都没得到。

我的XML:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<name>Roulette</name>

<modules>
    <module>application</module>
    <module>test</module>
</modules>

我的代码:

XDocument mainPOM = XDocument.Load(above_xml);
List<string> pomLocations = (from loc in mainPOM.Descendants("module") select (string)loc.Name.LocalName).ToList();
Console.WriteLine(pomLocations.Count);

不幸的是,pomLocations的长度为0 :(。

有人可以告诉我,我到底搞砸了什么?

1 个答案:

答案 0 :(得分:1)

您的根元素包含:

xmlns="http://maven.apache.org/POM/4.0.0"

这是为后代元素及其自身设置默认命名空间。所以元素的名称不仅仅是“项目” - 它是该命名空间中的“项目”。你想要:

XNamespace ns = "http://maven.apache.org/POM/4.0.0";
var locations = mainPOM.Descendants(ns + "project")
                       .Select(...);

我已将Select子句保留为“...”,因为我认为您并不真正想要loc.Name.LocalName,而Descendants因查询而永远是“项目”。

此外,目前还不清楚你真的想要project - 如果mainPOM.Root是根元素,为什么不只使用{{1}}?