2009-03-30 7 views
3

Я не уверен, почему это не работает.Основы 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] выше. На данный момент имя и структура блоков неизвестны. [Setting-name] известно.

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

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

+0

Вы не предоставили необходимой информации: полный XML-документ, без каких-либо обобщений, пожалуйста ;; Что представляет собой узел, представленный «шаблоном»? Возможно, это не главный узел документа. Наконец, что такое _collectionname? Можете ли вы просто привести пример со значениями * fixed * (остановка в отладчике!). –

+0

Шахта не работает. У меня есть объект XmlNode, свойство ChildNodes которого явно содержит два узла, оба из которых называются «wavetrack». Несмотря на это, когда я вызываю метод SelectNodes XmlNode («wavetrack»), полученный XmlNodeList содержит нулевые элементы. Это происходит несмотря на вариацию, которую я пробовал для XPath, включая «// wavetrack». Я понятия не имею, почему он не работает, потому что кажется, что это должно быть просто. – Triynko

+0

Кажется, это известное/неожиданное поведение: http://stackoverflow.com/questions/4271689/xml-selectnodes-with-default-namespace-via-xmlnamespacemanager-not-working-as-ex – Triynko

ответ

0

Что такое использование переменной pattern?
Является ли это ссылкой на DOM всего XML?

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

EDIT: Это хорошо сформированный XML?

+0

- это XMLNode, который содержит XML, показанный выше. –

0

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

+0

Определенных пространств имен не существует. И я проверил внешний XML, чтобы убедиться, что загружаю то, что, по-моему, загружаю. –

+0

Тогда как насчет только прокрутки шаблона.ChildNodes [0] .ChildNodes? – David

2

Вы пробовали:

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

ИЛИ

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

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

3

Вы пытались удалить «@» из своих строк XPath?

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

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

Марк

0

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

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

В этом случае kvpsList будет содержать все [block-of-xml-to-process] -s, хотя я не могу понять, почему. = ')

+0

Это не работает для меня. У меня есть узел, который содержит два узла wavetrack (это файл проекта Audacity). Тем не менее, когда я вызываю SelectNodes («wavetrack»), он возвращает нулевые элементы. Кажется, это известное/неожиданное поведение: http://stackoverflow.com/questions/4271689/xml-selectnodes-with-default-namespace-via-xmlnamespacemanager-not-working-as-ex – Triynko

0

Я столкнулся с одной и той же проблемой, и это похоже на известное, но неожиданное поведение. См. Xml-SelectNodes with default-namespace via XmlNamespaceManager not working as expected

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