2009-11-26 3 views
4

Mine - это общий вопрос о методах анализа XML.XML-синтаксический анализ с C#, XPath

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

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

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

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

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

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

Любые идеи?

+0

Если вы используете C# 3 или выше, рассмотрите возможность использования LINQ to XML. См. Http://msdn.microsoft.com/en-us/library/bb387098.aspx – TrueWill

ответ

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

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

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

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

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

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

Какой будет выбрать дочерний узел непосредственно.

+0

О, извините, я ошибся в сообщении. node1.SelectSingleNode ("/ Child"); это то, что я пробовал, он все еще смотрит на корневой узел документа. – Vercinegetorix

+0

ваш второй пример не работает: node1.SelectSingleNode ("/ Child"); У узла1 есть ссылка на корень документа, и когда вы выбираете с помощью начальной косой черты, он ищет из корня документа. Чтобы сделать это относительно узла1, вам нужно удалить косую черту. – dan

+0

К сожалению, эта косая черта была опечаткой с моей стороны. –

0

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

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

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

0

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

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

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