Не могу использовать Descendants () или Elements () с xmlns - PullRequest
10 голосов
/ 16 октября 2011

Я новичок в работе с 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>

Единственная разница между файлами является атрибутом.

Я не могу представить объяснения этому.Спасибо за вашу помощь.

Ответы [ 3 ]

10 голосов
/ 16 октября 2011

Просто для полноты:

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

(то, что сказал другой, верно, но я хотел бы дать другой вариант :-))

Для ультра полноты, если выхотите искать, игнорируя пространство имен:

var lst = doc.Descendants().Where(p => p.Name.LocalName == "B").ToList();
9 голосов
/ 16 октября 2011

Вам необходимо найти теги в этом пространстве имен:

XNamespace ns = "aaa";

xmlFile.Descendants(ns + "B").ToList()
7 голосов
/ 16 октября 2011

Вы должны указать пространство имен при запросе элементов.

Вы можете использовать метод GetDefaultNamespace , чтобы избежать его жесткого кодирования.Это также полезно, если вы не знаете, что это за время.

Пример:

var ns = xmlFile.GetDefaultNamespace();
var nodes = xmlFile.Descendants(ns + "B").ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...