Вернуть единственное приписанное значение через 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