Основы XmlNode.SelectNodes?

Я не уверен, почему это не работает.

У меня есть XmlNode в известном формате. Это:

<[setting-name]>
    <dictionary>
       <[block-of-xml-to-process]/>
       <[block-of-xml-to-process]/>
       <[block-of-xml-to-process]/>
    </dictionary>
</[setting-name]>

У меня есть ссылка на узел в переменной под названием шаблон. Мне нужна итеративная коллекция узлов, каждый из которых представлен вышеупомянутым [block-of-xml-to-process]. Название и структура блоков на данный момент неизвестны. [Название-настройки] известно.

Это кажется довольно простым. Я могу придумать полдюжины выражений XPATH, которые должны указывать на блоки. Я пробовал:

XmlNodeList kvpsList = pattern.SelectNodes(String.Format(@"/{0}/dictionary/*", _CollectionName));
XmlNodeList kvpsList = pattern.SelectNodes(String.Format(@"{0}/dictionary/*", _CollectionName));
XmlNodeList kvpsList = pattern.SelectNodes(@"//dictionary/*");
XmlNodeList kvpsList = pattern.SelectNodes(@"//dictionary");

Но мне явно не хватает базового понимания XPATH или некоторых специальных приемов .SelectNodes, потому что ни один из них не работает последовательно.

Что я делаю неправильно?


person Yes - that Jake.    schedule 30.03.2009    source источник
comment
Вы не предоставили жизненно необходимую информацию: полный XML-документ, без обобщений, пожалуйста; Что представляет собой узел, представленный шаблоном? Может быть, это не верхний узел документа. Наконец, что такое _collectionname? Вы можете просто привести пример с фиксированными значениями (остановитесь в отладчике!).   -  person Dimitre Novatchev    schedule 31.03.2009
comment
Моя тоже не работает. У меня есть объект XmlNode, свойство ChildNodes которого явно содержит два узла, оба названы wavetrack. Несмотря на это, когда я вызываю метод SelectNodes (wavetrack) XmlNode, полученный XmlNodeList содержит ноль элементов. Это происходит, несмотря на вариации, которые я пробовал для XPath, включая // wavetrack. Я понятия не имею, почему это не работает, потому что кажется, что это должно быть просто.   -  person Triynko    schedule 30.01.2013
comment
Похоже, это известное / неожиданное поведение: stackoverflow.com/questions/4271689/   -  person Triynko    schedule 30.01.2013
comment
См. stackoverflow.com/questions/558870/xpath-selectnodes-in-net, который решил проблему для меня, изменив с '//' на './/'   -  person Robin G Brown    schedule 20.01.2014


Ответы (6)


Вы пробовали удалить "@" из строк XPath ??

XmlNodeList kvpsList = pattern.SelectNodes("//dictionary");

Это должно сработать - у меня работает каждый день :-)

Марк

person marc_s    schedule 31.03.2009

Ты пытался:

XmlNodeList kvpsList = pattern.SelectNodes(@"//dictionary:child");

OR

XmlNodeList kvpsList = pattern.SelectNodes(@"/[setting-name]/dictionary:child");

В значительной степени получает дочерние элементы «словаря». Если это не работает, работает ли фактический вызов словаря?

person dkarzon    schedule 31.03.2009

Могут ли пространства имен вызывать проблему? Также попробуйте посмотреть на "pattern.OuterXml", чтобы убедиться, что вы смотрите на правильный элемент.

person David    schedule 30.03.2009
comment
Пространства имен не определены. И я проверил внешний XML, чтобы убедиться, что я загружаю то, что, как мне кажется, загружаю. - person Yes - that Jake.; 31.03.2009
comment
Тогда как насчет простого перебора pattern.ChildNodes [0] .ChildNodes? - person David; 31.03.2009

Какая польза от переменной pattern?
Это ссылка на DOM всего XML?

Посмотрите, к чему это приводит pattern.SelectNodes("//dictionary/").ChildNodes.Count

РЕДАКТИРОВАТЬ: это правильно сформированный xml?

person shahkalpeshp    schedule 30.03.2009

Я просто искал это и обнаружил, что это сработает, если вы просто наберете:

XmlNodeList kvpsList = pattern.SelectNodes("dictionary");

kvpsList будет содержать все [block-of-xml-to-process] -s, хотя я не могу понять почему. знак равно

person Knots    schedule 05.04.2012
comment
У меня это не работает. У меня есть узел, содержащий два узла волнового трека (это файл проекта Audacity). Тем не менее, когда я вызываю SelectNodes (волновой трек), он возвращает нулевые элементы. Похоже, это известное / неожиданное поведение: stackoverflow.com/questions/4271689/ - person Triynko; 30.01.2013

Я столкнулся с той же проблемой, и это кажется известным, но неожиданным поведением. См. Xml-SelectNodes с пространством имен по умолчанию через XmlNamespaceManager не работает должным образом

Например, я заставил его работать, создав экземпляр XmlNamespaceManager с помощью NameTable XmlDocument, а затем добавил пространство имен с произвольным именем, таким как «a», связанное с NamespaceURI основного элемента документа. Обратите внимание, что XmlDocument NamespaceURI в моем случае был пустым, но NameSpaceURI его DocumentElement фактически имел значение. Вероятно, поэтому это не сработало бы без первоначального указания пространства имен.

XmlDocument doc = new XmlDocument();
doc.Load( file.FullName );
XmlNode docElement = doc.DocumentElement as XmlNode;
XmlNamespaceManager nsman = new XmlNamespaceManager( doc.NameTable );
nsman.AddNamespace( "a", docElement.NamespaceURI );
docElement.SelectNodes( "a:wavetrack", nsman ); //docElement.SelectNodes("wavetrack") wasn't working
person Triynko    schedule 29.01.2013