Основы XmlNode.SelectNodes?

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

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

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

У меня есть ссылка на узел в переменной с именем pattern. Я хочу итеративную коллекцию узлов, каждый из которых представлен выше [блок-из-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, потому что ни один из них не работает согласованно.

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

6 ответов

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

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

Это должно работать - работает для меня ежедневно:-)

Марк

Ты пытался:

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

ИЛИ ЖЕ

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

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

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

Например, я заставил его работать, создав экземпляр XmlNamespaceManager с помощью NameTable XmlDocument, затем добавил пространство имен с произвольным именем, таким как "a", связанное с NamespaceURI основного элемента документа. Обратите внимание, что NamespaceURI XmlDocument в моем случае был пустым, но 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

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

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

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

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

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

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

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

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