可能重复:
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 :(。
有人可以告诉我,我到底搞砸了什么?
答案 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}}?