【问题标题】:Can't get the text from a node in XML无法从 XML 中的节点获取文本
【发布时间】:2011-11-04 21:39:17
【问题描述】:

这可能是一个简单的问题,但是使用 xmlhttp,我如何在这个 XML 中获取令牌节点的文本?一定有比这更好的方法:

XML.FirstChild.NextSibling.FirstChild.FirstChild.FirstChild.FirstChild.NextSibling.Text

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetToken2Response xmlns="webservice">
      <GetToken2Result>
        <ResponseStatus>
          <ResponseCd>Fail or Success or Warning</ResponseCd>
          <ResponseMsg>string</ResponseMsg>
          <Version>string</Version>
        </ResponseStatus>
        <Token>string</Token>
        <Expiration>double</Expiration>
        <Valid>boolean</Valid>
      </GetToken2Result>
    </GetToken2Response>
  </soap:Body>
</soap:Envelope>

【问题讨论】:

  • 老兄,你必须查看 XPath....FirstChild.NextSibling.FirstChild.FirstChild.FirstChild... 的业务无法管理!

标签: xml excel vba soap xmlhttprequest


【解决方案1】:

更新为包含命名空间。不幸的是,我无法弄清楚如何处理您的实际示例 xml 中的 'xmlns="webservice"'...

Sub Test()
    Dim sXML As String
    Dim xmlDoc As DOMDocument
    Dim xNodeResult As IXMLDOMNode
    Dim xNodeToken As IXMLDOMNode

    Set xmlDoc = New DOMDocument40

    sXML = "<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""" & _
                 " xmlns:xsd = ""http://www.w3.org/2001/XMLSchema""" & _
                 " xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">" & _
                 "<soap:Body>" & _
                 "<GetToken2Response>" & _
                 "<GetToken2Result>" & _
                 "   <ResponseStatus>" & _
                 "     <ResponseCd>Fail or Success or Warning</ResponseCd>" & _
                 "     <ResponseMsg>string</ResponseMsg>" & _
                 "     <Version>string</Version>" & _
                 "   </ResponseStatus>" & _
                 "   <Token>string</Token>" & _
                 "   <Expiration>double</Expiration>" & _
                 "   <Valid>boolean</Valid>" & _
                "</GetToken2Result>" & _
                "</GetToken2Response>" & _
                "</soap:Body>" & _
                "</soap:Envelope>"


    xmlDoc.validateOnParse = True
    xmlDoc.setProperty "SelectionNamespaces", _
              "xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'"

    xmlDoc.LoadXML (sXML)
    If xmlDoc.parseError.reason <> "" Then
        Debug.Print "Parse error: " & xmlDoc.parseError.reason
        Exit Sub
    End If

    xmlDoc.setProperty "SelectionLanguage", "XPath"

    Set xNodeResult = xmlDoc.DocumentElement.SelectSingleNode( _
       "/soap:Envelope/soap:Body/GetToken2Response/GetToken2Result")
    Debug.Print xNodeResult.XML

    Set xNodeToken = xNodeResult.SelectSingleNode("Token")

    If Not xNodeToken Is Nothing Then
        Debug.Print xNodeToken.nodeTypedValue
    Else
        Debug.Print "???"
    End If
End Sub

【讨论】:

  • 我尝试使用 XPath,但可能我的搜索字符串错误。起初我尝试 /GetToken2Response/GetToken2Result/Token 并且它返回一个空白字符串。我知道 XML 令牌不是空白的,因为我仍然可以使用 FirstChild.NextSibling 获取令牌。给定我的问题中的 XML,我的 XPath 选择字符串会是什么样子?谢谢!
  • 由于名称空间的原因,您的示例有点复杂(这是我以前不知道的问题,因为这不是我的专业领域......)我“有点" 让它在 "webservice" 命名空间的例外情况下工作,这似乎破坏了它......查看更新的答案。
【解决方案2】:

我将您的 XML 保存到一个文件中,然后运行此程序,它给了我“字符串”作为 Token 的值。

Public Sub ReadToken()
    Dim strUrl As String
    Dim objDoc As Object
    Dim strToken As String

    strUrl = CurrentProject.Path & Chr(92) & "brettville.xml"

    Set objDoc = CreateObject("Msxml2.DOMDocument.3.0")
    objDoc.async = False
    objDoc.validateOnParse = True
    objDoc.Load strUrl

    strToken = objDoc.getElementsByTagName("Token").Item(0).Text
    Debug.Print "strToken: '" & strToken & "'"
    Set objDoc = Nothing
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2016-05-06
    • 2018-02-22
    相关资源
    最近更新 更多