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.