0

可能重复:
了解 Linq To Xml - 后代不返回任何结果

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

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

在那里,他们这样做:

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

他们使用“后代”来处理 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 :(。

有人可以告诉我我到底在哪里搞砸了吗?

4

1 回答 1

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?

于 2012-11-02T13:15:40.230 回答