XmlElement.SelectNodes(..) - ничего не находит.. Помогите?

Извините, что беспокою вас за такой простой вопрос, но я застрял здесь с часом:

У меня есть XML-файл, который выглядит примерно так:

<?xml version="1.0" encoding="utf-8"?>
<aaa xmlns="http://blabla.com/xmlschema/v1">

  <bbb>
    <ccc>Foo</ccc>
  </bbb>

  <ddd x="y" />
  <ddd x="xx" />
  <ddd x="z" />

</aaa>

Я пытаюсь получить доступ к элементам "DDD", как это:

var doc = new XmlDocument();
doc.Load("example.xml");
foreach (XmlNode dddNode in doc.DocumentElement.SelectNodes("//ddd"))
{
   // do something
   Console.WriteLine(dddNode.Attributes["x"].Value);
}

Во время выполнения цикл foreach пропускается, потому что я не получаю никаких узлов обратно из метода.SelectNodes. Я сломал перед циклом и посмотрел на InnerXML, который выглядит хорошо, и я также попробовал все виды XPath (например, "//bbb" или "/aaa/ddd"), но только "/", кажется, не возвращает ноль.

Этот точный код работал для меня раньше, сейчас это не так. Я подозреваю что-то с этим объявлением пространства имен в теге aaa, но я не мог понять, почему это должно вызывать проблемы. Или... ты видишь что-нибудь, чего мне не хватает?

1 ответ

Решение

Это пространства имен xml. Здесь нет ddd, Однако есть x:ddd где x Ваш псевдоним http://blabla.com/xmlschema/v1, Вам нужно будет протестировать пространства имен - например:

var nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("x", "http://blabla.com/xmlschema/v1");
var nodes = doc.DocumentElement.SelectNodes("//x:ddd", nsmgr);
// nodes has 3 nodes

Заметка x в вышесказанном является произвольным; в этом нет никакого значения x кроме удобства.

Это (довольно неудобно) означает добавление пространства имен (или псевдонима, как указано выше) во все ваши выражения xpath.

Другие вопросы по тегам