Основы 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", чтобы убедиться, что вы смотрите на правильный элемент.