VBScript Can not Select XML nodes

前端 未结 3 1147
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-28 18:00

I am trying to Select nodes from some webservice response XML to no avail. For some reason I am able to select the root node (\"xmldata\") however, when I try to drill deeper(\"

相关标签:
3条回答
  • 2021-01-28 18:22

    Short answer

    oXMLHttp.ResponseXML.text may return some text, but not 'A string containing a URL that specifies the location of the XML file' as required for the parameter of .load. So replace

    xmlDoc.load (oXMLHttp.ResponseXML.text)
    

    with

    xmlDoc.loadXml oXMLHttp.ResponseXML.xml
    

    If that 'does not work', say so; I then will try to provide a longer answer.

    (P.S. to the short answer: AnthonyWJones' advice not to transform the XML twice is sound; I offered this 'minimal impact on existing code' approach in the hope to get the OT over the first hurdle, not as a generally applicable strategy.)

    Longer answer

    If you have XML problems on an ASP page, you should try to isolate and test the XML specific problems in a console script. For your problem I filled a skeleton (load .xml file, check for errors) with code to access nodes via XPath and DOM tree:

      Dim oFS    : Set oFS  = CreateObject( "Scripting.FileSystemObject" )
      Dim sFSpec : sFSpec   = oFS.GetAbsolutePathName("..\data\00.xml")
      Dim oXml   : Set oXml = CreateObject("Msxml2.DOMDocument")
    
      oXml.setProperty "SelectionLanguage", "XPath"
      oXml.async = False
      oXml.load sFSpec
    
      If 0 = oXml.parseError.errorCode Then
         WScript.Echo "loaded:", sFSpec
         WScript.Echo "root:", oXml.documentElement.tagName
    
         Dim sXPath, ndlFnd, ndChild, ndFnd
    
         sXPath = "/xmldata/customers"
         Set ndlFnd = oXml.selectNodes(sXPath)
         If 0 = ndlFnd.length Then
            WScript.Echo "no '" & sXPath & "' found"
         Else
            WScript.Echo "found", ndlFnd.length, "node(s) for '" & sXPath & "'"
            sXPath = "firstname"
            For Each ndChild In ndlFnd
                WScript.Echo "child:", ndChild.tagName
                Set ndFnd = ndChild.selectSingleNode(sXPath)
                If ndFnd Is Nothing Then
                   WScript.Echo "no '" & sXPath & "' found"
                Else
                   WScript.Echo ndFnd.text, "==", ndChild.childNodes(1).text
                End If
            Next
         End If
      Else
         WScript.Echo "errorCode:", oXml.parseError.errorCode
         WScript.Echo oXml.parseError.reason
      End If
    

    output:

    loaded: E:\trials\SoTrials\answers\11166940\data\00.xml
    root: xmldata
    found 1 node(s) for '/xmldata/customers'
    child: customers
    Jim == Jim
    

    As you can see

    1. I use standard/approved methods to check the result of the single steps (e.g. parseError (instead of voodoo length test) to see if I got a well-formed/valid/usable document)
    2. When in doubt, I put in a WScript.Echo to make sure my assumptions about what VBScript should deliver hold water.
    0 讨论(0)
  • 2021-01-28 18:32

    First off stop doing this:

    Dim doc : Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    xmlDoc.LoadXML (oXmlHttp.responseXML.xml)
    

    XML in the response is parsed into a DOM, which you then ask to be converted back into a string (.xml) which then parse (again) into another DOM (.LoadXML).

    Do simply this:

    Dim xmlDoc : Set xmlDoc = oXmlHttp.responseXML
    

    Secondly you are correct in your answer XPath is case-sensitive so your XPaths (apart from the .text goof which Ekkehard has already pointed out) wouldn't work because the xml you are getting didn't match what you thought you were getting.

    Finally the definition of "Camel casing" is does vary but generally this "postalAddress" is camel cased and this "PostalAddress" is refered to as "Pascal casing".

    0 讨论(0)
  • 2021-01-28 18:37

    Ok, so I finally worked out what I was doing wrong. As the xml I was retrieving was from a webservice, and I had limited information about it, I used the following to write the xml to the page so that I could see how it was structured.

    Response.Write oXMLHttp.ResponseXml.xml
    

    For some reason(maybe someone could fill this part in) it wrote all the XML tags in lower case. It turns out that after some investigation and after doing the following I found out that this was not the truth!

    dim nodeList
    Set nodeList = xmlDoc.SelectNodes("//xmldata/")
    
    for each item In nodeList
        response.write(item.text & " -> Tag Name: " & item.nodeName & "<br />")
    Next
    
    'this wrote the following to the page
    '22506 -> Tag Name: CustomerID
    'Jim -> Tag Name: FirstName
    'N -> Tag Name: IsSuperAdmin
    'Jones 2 -> Tag Name: LastName
    

    As you can see the 'nodeName' property output shows the tags to be camel case. So that ResponseXML was rather misleading and seeing XPath is case sensitive was preventing me from selecting the Nodes in question.

    0 讨论(0)
提交回复
热议问题