不能将Descendants()或Elements()与xmlns一起使用

Tom*_*ata 10 c# xml linq linq-to-xml

我是使用XML的新手,在尝试从spring.net配置文件中获取特定标记时遇到了一个奇怪的问题.在尝试使用测试xml文件缩小问题范围后,我发现应用以下代码:

List<XElement> nodes = xmlFile.Descendants("B").ToList();
Run Code Online (Sandbox Code Playgroud)

提供包含以下文件的非空列表:

<?xml version="1.0" encoding="utf-8" ?>
<A fakeAttribute="aaa">
  <B id="DbProvider"/>
</A>
Run Code Online (Sandbox Code Playgroud)

但是提供了一个带有以下文件的空字符串:

<?xml version="1.0" encoding="utf-8" ?>
<A xmlns="aaa">
  <B id="DbProvider"/>
</A>
Run Code Online (Sandbox Code Playgroud)

作为属性的文件之间的唯一区别.

我无法想象对此的解释.谢谢你的帮助.

xan*_*tos 10

为了完整起见:

var lst = doc.Descendants("{aaa}B").ToList();
Run Code Online (Sandbox Code Playgroud)

(另一个说的是正确的,但我想给另一种选择:-))

为了超完整性,如果要搜索忽略命名空间:

var lst = doc.Descendants().Where(p => p.Name.LocalName == "B").ToList();
Run Code Online (Sandbox Code Playgroud)


SLa*_*aks 9

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

XNamespace ns = "aaa";

xmlFile.Descendants(ns + "B").ToList()
Run Code Online (Sandbox Code Playgroud)

  • @Tomata如果你想忽略命名空间,你可以编写类似:`var lst = doc.Descendants().Where(p => p.Name.LocalName =="B").ToList();` (4认同)

Ahm*_*eed 7

您应该在查询元素时指定命名空间.

您可以使用GetDefaultNamespace方法来避免对其进行硬编码.如果你不知道它是什么,它也很有用.

例:

var ns = xmlFile.GetDefaultNamespace();
var nodes = xmlFile.Descendants(ns + "B").ToList();
Run Code Online (Sandbox Code Playgroud)