问题
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