Синтаксический анализ XML с C #, XPath - PullRequest
4 голосов
/ 26 ноября 2009

Мой общий вопрос о методах синтаксического анализа XML.

Допустим, у нас есть документ XML, и мы используем XPath для получения некоторого узла из этого документа:

XMLNode node1=XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode");

Теперь n содержит данные SomeOtherNode. Интуитивно я ожидаю следующую строку кода:

XMLNode node2=XMLDoc.SelectSingleNode("/Child");

для заполнения узла2 теми потомками узла1, которые называются «дочерними». Но, к сожалению, это не работает таким образом. Поиск XPath начинается с корня документа, а не с объекта XMLNode, для которого он был вызван. Есть ли способ заставить его работать «интуитивно»? Это было бы удобно для рекурсивного или объектно-ориентированного подхода к синтаксическому анализу.

Я пытался использовать объект XMLPathNavigator, но он работает так же. И кажется, что я мог бы установить внутренний текст XMLDocumentFragment во внутренний текст данного узла, но это похоже на неэффективное дублирование данных.

Есть идеи?

Ответы [ 3 ]

8 голосов
/ 26 ноября 2009
XMLNode node2 = XMLDoc.SelectSingleNode("/Child");

Это выберет элемент с именем 'Child' из корня (/). Обратите внимание, что вы применяете вызов для XMLDoc, , а не для узла 1, поэтому он будет относиться к корню документа. Я думаю, что вы хотите:

XMLNode node2 = node1.SelectSingleNode("Child"); // edit: removed slash

Это XPath относительно ранее выбранного узла, а не корня документа.

В качестве альтернативы вы можете сделать:

XMLNode node = XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode/Child")

Который выберет дочерний узел напрямую.

0 голосов
/ 26 ноября 2009

с использованием // вместо / будет сопоставлять все узлы с данным именем.

/ Выбирает из корневого узла

// Выбирает узлы в документе из текущего узла, которые соответствуют выбору, независимо от того, где они находятся

0 голосов
/ 26 ноября 2009

Я считаю, что это должно быть:

XMLNode node2=XMLDoc.SelectSingleNode(".//Child");

(Примечание точка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...