不能对xmlns使用Descendants()或Elements()

本文关键字:Elements Descendants xmlns 使用 不能 | 更新日期: 2023-09-27 18:11:29

我是使用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>

文件之间唯一的区别是属性。

我想不出一个解释。谢谢你的帮助。

不能对xmlns使用Descendants()或Elements()

您需要在该名称空间中搜索标记:

XNamespace ns = "aaa";
xmlFile.Descendants(ns + "B").ToList()

为完整起见:

var lst = doc.Descendants("{aaa}B").ToList();

(别人说的是正确的,但我想给另一个选项:-))

为了超级完整起见,如果您想要搜索忽略命名空间:

var lst = doc.Descendants().Where(p => p.Name.LocalName == "B").ToList();

在查询元素时应该指定名称空间。

你可以使用GetDefaultNamespace方法来避免硬编码。如果你事先不知道它是什么,它也很有用。

的例子:

var ns = xmlFile.GetDefaultNamespace();
var nodes = xmlFile.Descendants(ns + "B").ToList();