XmlElement.SelectNodes (..) - ничего не находит .. Помогите? - PullRequest
6 голосов
/ 31 октября 2011

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

У меня есть 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>

Iя пытаюсь получить доступ к элементам '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"), но только "/", кажется, не возвращаетnull.

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

1 Ответ

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

Это пространства имен 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.

...