Can't use Descendants() or Elements() with xmlns

放肆的年华 提交于 2019-12-18 20:49:28

问题


I'm new to working with XML, and I've encountered a weird problem while trying to get a specific tag from a spring.net configuration file. After trying to narrow down the problem with a test xml file, I found out that applying the following code:

List<XElement> nodes = xmlFile.Descendants("B").ToList();

provides a non-empty list with the following file:

<?xml version="1.0" encoding="utf-8" ?>
<A fakeAttribute="aaa">
  <B id="DbProvider"/>
</A>

but provides an empty string with the following file:

<?xml version="1.0" encoding="utf-8" ?>
<A xmlns="aaa">
  <B id="DbProvider"/>
</A>

The only difference between the files being the attribute.

I can't imagine an explanation for this. Thanks for your help.


回答1:


You need to search for tags in that namespace:

XNamespace ns = "aaa";

xmlFile.Descendants(ns + "B").ToList()



回答2:


Just for completeness sake:

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

(what the other told is correct, but I wanted to give another option :-) )

For ultra completeness-sake, if you want to search ignoring the namespace:

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



回答3:


You should specify the namespace when querying for the elements.

You can use the GetDefaultNamespace method to avoid hard-coding it. It's also useful if you don't know what it is ahead of time.

Example:

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


来源:https://stackoverflow.com/questions/7785795/cant-use-descendants-or-elements-with-xmlns

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!