Вернуть единственное приписанное значение через xpath

У меня есть немного XML

<?xml version="1.0" encoding="utf-8"?>
<rsp stat="ok">
  <auth>
    <token>123456</token>
    <perms>write</perms>
    <user nsid="74461753@N03" username="user" fullname="name" />
  </auth>
</rsp>

И я пытаюсь использовать XPath, чтобы получить значение "token" в строку. Просто да. Но я могу сделать это?

Dim doc As New XmlDocument
doc.Load(url)   'gets the XML above.

Dim xmlNav As XPathNavigator

Dim xmlNI As XPathNodeIterator

xmlNav = doc.CreateNavigator()

xmlNI = xmlNav.Select("token")

Как вывести "123456" в переменную?

3 ответа

Решение

Класс XPathNodeIterator предоставляет набор выбранных узлов, которые вы можете перебирать. Есть две проблемы с вашим кодом.

Во-первых, ваш XPath неверен - это должен быть "/rsp/auth/token", а не "token".

Во-вторых, вам нужно перебрать возвращенную коллекцию (в этом случае вы получаете только один узел). Вы можете сделать это одним из двух способов:

xmlNI = xmlNav.Select("/rsp/auth/token")
xmlNI.MoveNext()
Dim selectedNode As XPathNavigator = xmlNI.Current
' value of the node can be accessed by selectedNode.Value

Или вы можете использовать цикл For Each:

For Each node As XPathNavigator In xmlNI
    ' value of the node can be accessed by node.Value
Next

Если вы можете использовать LINQ to XML, это еще проще (вам нужно добавить ссылку на System.Xml.Linq с помощью Imports System.Xml.Linq):

Dim xml As XElement = XElement.Load(url)

Dim auth As String = xml.Descendants("token").FirstOrDefault()

XmlDocument содержит методы для получения элементов в соответствии с XPath.

Dim doc As New XmlDocument
doc.Load(url)

Dim TokenElement As XmlElement = doc.DocumentElement.SelectSingleNode("auth/token/text()")

If(Not(TokenElement Is Nothing)) Then 'XmlNode.SelectSingleNode(String) can be Nothing if the expression finds no node
    Dim strValue As String = TokenElement.Value
End If

Тебе нужно XPathNavigator обязательно? Я получил это так:

Dim list As Xml.XmlNodeList = doc.SelectNodes("rsp/auth/token")
If list IsNot Nothing And list.Count > 0 Then
    Dim myValue As String = list(0).FirstChild.Value
    Console.WriteLine(myValue) 'prints 123456'
End If
Другие вопросы по тегам