我是使用XML的新手,我在尝试从spring.net配置文件中获取特定标记时遇到了一个奇怪的问题。在尝试使用测试xml文件缩小问题范围后,我发现应用以下代码:
List<XElement> nodes = xmlFile.Descendants("B").ToList();
提供带有以下文件的非空列表:
<?xml version="1.0" encoding="utf-8" ?>
<A fakeAttribute="aaa">
<B id="DbProvider"/>
</A>
但提供带有以下文件的空字符串:
<?xml version="1.0" encoding="utf-8" ?>
<A xmlns="aaa">
<B id="DbProvider"/>
</A>
作为属性的文件之间的唯一区别。
我无法想象对此的解释。谢谢你的帮助。
答案 0 :(得分:9)
您需要在该命名空间中搜索标记:
XNamespace ns = "aaa";
xmlFile.Descendants(ns + "B").ToList()
答案 1 :(得分:9)
为了完整起见:
var lst = doc.Descendants("{aaa}B").ToList();
(另一个说的是正确的,但我想给另一种选择:-))
为了超完整性,如果要搜索忽略命名空间:
var lst = doc.Descendants().Where(p => p.Name.LocalName == "B").ToList();
答案 2 :(得分:6)
在查询元素时应指定命名空间。
您可以使用GetDefaultNamespace method来避免对其进行硬编码。如果你不知道它是什么,它也很有用。
示例:
var ns = xmlFile.GetDefaultNamespace();
var nodes = xmlFile.Descendants(ns + "B").ToList();