【问题标题】:Selecting node value in XML document returns null在 XML 文档中选择节点值返回 null
【发布时间】:2013-02-26 04:23:02
【问题描述】:

这是我要解析的 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")

如何读取“0.7627”的结果值?

我试过了:

nodeList(0).InnerText

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

两者都抛出错误“对象引用未设置为对象的实例。”

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

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

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

然后选择通过:

node.InnerText

但这也会抛出“对象引用未设置为对象的实例。”

【问题讨论】:

    标签: xml vb.net


    【解决方案1】:

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

    • 您需要正确定义命名空间(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)
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-08
        • 2018-08-31
        • 1970-01-01
        • 2018-05-17
        • 2012-04-10
        • 2020-04-01
        相关资源
        最近更新 更多