Изменить корень XPath XmlDocument в .net (C #)? - PullRequest
2 голосов
/ 19 января 2011

При выборе из XmlDocument, например, с помощью XPath-метода SelectSingleNode, мы получаем XmlNode, состоящий из первого совпадающего узла, давайте вызывать его,Если мы сделаем дальнейший отбор натогда можно было бы ожидать, что XPath-корень теперь является этим узлом, но это неверно, корень все тот же, что и в исходном XmlDocument.Вот пример:

XmlDocument xd = new XmlDocument();
xd.LoadXml(@"<root>
                 <subroot>
                     <elm>test1</elm>
                     <elm>test2</elm>
                     <elm>test3</elm>
                 </subroot>
             </root>");
XmlNode xnSubRoot = xd.SelectSingleNode("/root/subroot");

//This is the XPath I want to be able to use, but it returns null.
XmlNode xnElm = xnSubRoot.SelectSingleNode("/subroot/elm");

//This works, but the XPath-root is the same as in the original document.
xnElm = xnSubRoot.SelectSingleNode("/root/subroot/elm");

Есть ли способ «исправить» корень xnSubRoot, чтобы я мог использовать нужный XPath?Причина моего вопроса в том, что у меня есть случай, когда я вызываю веб-сервис, который возвращает XmlNode, где свойство OuterXml показывает структуру "/ Data / SubElement / ..." и т. Д., Но при запуске XPath "/ Data "then null возвращается, только" / SubElement "работает, т.е. XPath-корень кажется на один уровень ниже, чем фактический корень документа.

Я уверен, что есть вполне разумное объяснениеэто или что я упускаю что-то жизненно важное.Однако я действительно не могу ничего найти, хотя я прочитал http://msdn.microsoft.com/en-us/library/d271ytdx(VS.80).aspx.

NB. Я понимаю, что было бы возможно использовать XPath "// subroot / elm", но затем яможет также получить другие элементы в структуре XML.

Ответы [ 2 ]

2 голосов
/ 19 января 2011

Это работает:

XmlNode xnSubRoot = xd.SelectSingleNode("/root/subroot");
XmlNode xnElm = xnSubRoot.SelectSingleNode("elm");

И вот так:

XmlNode xnRoot = xd.SelectSingleNode("/root");
XmlNode xnElm = xnRoot.SelectSingleNode("subroot/elm");
2 голосов
/ 19 января 2011

Поскольку вы выбрали из Root/SubElement Попробуйте:

XmlNode xnElm = xnSubRoot.SelectSingleNode("elm"); 

Будет возвращен первый дочерний elm узел текущего узла.

Редактировать (сдополнительная информация, предоставленная в комментариях:

В этом конкретном случае вы получаете XmlNode (который является вашим узлом данных) от вызова WebService.Все запросы XPath для этого XmlNode будут относиться к нему.

Я бы посоветовал вам изменить все ваши XPath для использования селектора, например webServiceNode.SelectSingleNode("SubElement/SubSubElement");.Здесь нет причин указывать абсолютные запросы XPath.

...