C# Can';t将子体()或元素()用于xmlns

C# Can';t将子体()或元素()用于xmlns,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我是XML新手,在尝试从spring.net配置文件获取特定标记时遇到了一个奇怪的问题。在尝试缩小测试xml文件的问题范围后,我发现应用以下代码: List<XElement> nodes = xmlFile.Descendants("B").ToList(); List nodes=xmlFile.subscriptions(“B”).ToList(); 提供包含以下文件的非空列表: <?xml version="1.0" encoding="utf-8" ?> &

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

List<XElement> nodes = xmlFile.Descendants("B").ToList();
List nodes=xmlFile.subscriptions(“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>

但为以下文件提供一个空字符串:

<?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>

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


我想不出有什么解释。感谢您的帮助。

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

XNamespace ns = "aaa";

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

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

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

例如:

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

为了完整起见:

var lst = doc.Descendants("{aaa}B").ToList();
(对方所说的是正确的,但我想给出另一个选择:-)

为了更完整,如果要忽略命名空间进行搜索,请执行以下操作:

XNamespace ns = "aaa";

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

谢谢这确实起到了作用,但也为另一个问题开辟了道路。例如,我可以获得名为“B”的子体,但无法获得名为“db:provider”(不使用“db”或“db:provider”)的子体,这正是我需要做的。db被列为不同的名称空间。我的错。@Tomata如果您想忽略名称空间,可以编写如下内容:
var lst=doc.substands().Where(p=>p.Name.LocalName==“B”).ToList()
在一种情况下,.GetDefaultNamespace不起作用,因为XML架构作者使用的不是xmlns,而是xmlns:foo。您可以使用:var ns=xDoc.Root.GetNamespaceOfPrefix(“foo”);