在XML文档中选择节点值将返回null

时间:2013-02-25 20:07:41

标签: xml vb.net

这是我试图解析的XML响应:

<?xml version="1.0" encoding="utf-8"?>
<double xmlns="http://www.webserviceX.NET/">0.7627</double>

VB代码:

Dim responseString As String

Dim fromCurrency As String = "EUR"
Dim toCurrency As String = "USD"


Dim req As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=" & fromCurrency & "&ToCurrency=" & toCurrency)
Dim Resp As System.Net.HttpWebResponse = req.GetResponse()
Dim reader As StreamReader = New StreamReader(Resp.GetResponseStream)
responseString = reader.ReadToEnd()

'get the XML
Dim objXML As New XmlDocument
objXML.LoadXml(responseString)

Dim root As XmlNode = objXML.DocumentElement

Dim nodeList As XmlNodeList = root.SelectNodes("/double")

如何读取&#34; 0.7627&#34;?

的结果值

我试过了:

nodeList(0).InnerText

nodeList(0).SelectSingleNode("/double").InnerText

两者都抛出错误&#34;对象引用未设置为对象的实例。&#34;

我还尝试添加命名空间管理器:

Dim mgr As XmlNamespaceManager = New XmlNamespaceManager(objXML.NameTable)
mgr.AddNamespace("currency", objXML.DocumentElement.NamespaceURI)

Dim node As XmlNode = objXML.SelectSingleNode("double", mgr)

并选择通过:

node.InnerText

但是这也引发了#34;对象引用未设置为对象的实例。&#34;

2 个答案:

答案 0 :(得分:3)

以下是我在代码中看到的问题:

  • 您需要正确定义命名空间(它是XML中的那个:"http://www.webserviceX.NET/"

  • 您需要在传递给SelectSingleNode的XPath表达式中使用命名空间

我是这样做的(使用C#):

var namespaceManager = new XmlNamespaceManager(objXML.NameTable);
namespaceManager.AddNamespace("wsx", "http://www.webserviceX.NET/");

var doubleNode = root.SelectSingleNode("/wsx:double", namespaceManager);

Console.WriteLine(doubleNode.InnerText);

这是VB.NET的等价物(我希望它是对的,我使用工具转换代码):

Dim namespaceManager = New XmlNamespaceManager(objXML.NameTable)
namespaceManager.AddNamespace("wsx", "http://www.webserviceX.NET/")

Dim doubleNode = root.SelectSingleNode("/wsx:double", namespaceManager)

Console.WriteLine(doubleNode.InnerText)

答案 1 :(得分:0)

您可以尝试使用LINQ to XML:

Imports System.XML.Linq

(...)

Dim req As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=" & fromCurrency & "&ToCurrency=" & toCurrency)
Dim Resp As System.Net.HttpWebResponse = req.GetResponse()

Dim doc as XDocument = XDocument.Load(Resp.GetResponseStream)
Dim myDoubleValue as Double = CDbl(doc.Root)

myDoubleValue应为0.7627