Estoy tratando de Seleccionar los nodos de algún servicio web XML de respuesta fue en vano. Por alguna razón soy capaz de seleccionar el nodo raíz («xmldata») sin embargo, cuando yo intente perforar más profundo(«xmldata/clientes») todo se devuelve vacío! A continuación es una muestra de que el XML devuelto por el servicio web.

<xmldata>
  <customers>
    <customerid>22506</customerid>
    <firstname>Jim</firstname>
    <issuperadmin>N</issuperadmin>   
    <lastname>Jones</lastname>
  </customers>
</xmldata>

y este es el código que estoy tratando de select idcliente, nombre, y apellido;

' Send the Xml
oXMLHttp.send Xml_to_Send

' Validate the Xml
dim xmlDoc
set xmlDoc = Server.CreateObject("Msxml2.DOMDocument")
xmlDoc.load (oXMLHttp.ResponseXML.text)
if(len(xmlDoc.text) = 0) then
    Xml_Returned = "<B>ERROR in Response xml:<BR>ERROR DETAILS:</B><BR><HR><BR>" 
end if

dim nodeList
Set nodeList = xmlDoc.SelectNodes("xmldata/customers")

For Each itemAttrib In nodeList
    dim custID, custLname, custFname    
    custID =itemAttrib.selectSingleNode("customerid").text
    custLname =itemAttrib.selectSingleNode("lastname").text
    custFname =itemAttrib.selectSingleNode("firstname").text
    response.write("News Subject: " & custID)
    response.write("<br />News Subject: " & custLname)
    response.write("<br />News Date: " & custFname)
Next

El resultado del código anterior es nada de nada! nada está escrito en la página. Una cosa extraña es que si yo seleccione el elemento raíz y obtener su longitud, de la siguiente manera;

Set nodeList = xmlDoc.SelectNodes("xmldata")
Response.Write(nodeList.length) '1 is written to page

Se determina correctamente la longitud de 1. Sin embargo, cuando me tratan de la misma con el siguiente nodo de la siguiente manera;

Set nodeList2 = xmlDoc.SelectNodes("xmldata/customers")
Response.Write(nodeList.length) '0 is written to page

Devuelve una longitud de 0. Por QUÉ!

Por favor, tenga en cuenta que esta no es la única forma que he intentado acceder a los valores de estos nodos. No puedo trabajar de lo que estoy haciendo mal. Podría por favor alguien que me ayude. Saludos.

InformationsquelleAutor urbanMethod | 2012-06-23

3 Comentarios

  1. 2

    Primero dejar de hacer esto:

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

    XML en la respuesta se analiza en un DOM que, a continuación, pedir a volver a convertirse en una cadena de texto (.xml) que, a continuación, analizar (de nuevo) en otro DOM (.LoadXML).

    Hacer simplemente esto:

    Dim xmlDoc : Set xmlDoc = oXmlHttp.responseXML

    En segundo lugar, estás en lo correcto en su respuesta XPath es sensible a mayúsculas para que su Xpath (aparte de el .texto de la metedura de pata que Ekkehard ya ha señalado) no funcionaría porque el xml que están recibiendo no coinciden con lo que pensábamos.

    Finalmente la definición de «Camel casing» se hace variar, pero generalmente este «postalAddress» es camello entubado y este «PostalAddress» que nos referimos como «Pascal casing».

    • gracias por señalar el error en mi respuesta corta.
    • Gracias antonio por tu respuesta. Sin embargo, todavía no tengo la respuesta para el problema real que me causó principal problema ¿por qué todas las etiquetas que se hacen a menor caso. Digo esto porque todos los errores de código que se han señalado se debe realmente a mí experimentando y no la causa del problema. ps. Iba a decir Superior Camello Caso apaciguado usted? 🙂
    • No estoy seguro de cómo usted encuentra que algo «hizo que todas las etiquetas en minúsculas»? MSXML no hace eso. Tal vez si usted se describe en detalle exactamente ¿cómo se las arregló para observar este fenómeno.
  2. 2

    Respuesta corta

    oXMLHttp.ResponseXML.el texto puede devolver algo de texto, pero no «Una cadena que contiene una dirección URL que especifica la ubicación del archivo XML’ como se requiere para el parámetro de .de carga. Por lo tanto, reemplace

    xmlDoc.load (oXMLHttp.ResponseXML.text)

    con

    xmlDoc.loadXml oXMLHttp.ResponseXML.xml

    Si es que ‘no funciona’, dicen; I, a continuación, se tratará de ofrecer una respuesta más larga.

    (P. S. a la respuesta corta: AnthonyWJones consejos de no para transformar el XML dos veces es el sonido, me ofreció este «impacto mínimo en el código existente’ en la esperanza de obtener el OT sobre las primeras de cambio, no como una estrategia de aplicación general.)

    Respuesta larga

    Si usted tiene XML problemas en una página ASP, usted debe tratar de aislar y probar el XML problemas específicos en una secuencia de comandos de consola. Para tu problema me llena un esqueleto (de carga .archivo xml, verificación de errores) con un código de acceso a los nodos a través de XPath y el árbol DOM:

      Dim oFS    : Set oFS  = CreateObject( "Scripting.FileSystemObject" )
      Dim sFSpec : sFSpec   = oFS.GetAbsolutePathName("..\data
      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
    .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

    de salida:

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

    Como se puede ver

    1. Yo uso estándar/métodos aprobados para comprobar el resultado de los pasos (por ejemplo, parseError (en lugar de vudú longitud de la prueba) para ver si tengo un bien formados/validez/usable documento)
    2. Cuando en duda, me metieron en un WScript.Echo para asegurarse de que mis suposiciones acerca de lo que VBScript debe entregar retención de agua.
    • Hola Ekkerhard, gracias por la respuesta. He intentado lo que han sugerido y sigo teniendo el mismo problema tratando de seleccionar nada más profundo que la xmldata nodo.
    • Saludos de la extensión de la respuesta. Resolví mi problema estaba relacionado con la sensibilidad a mayúsculas y minúsculas(he publicado los detalles). Voy a estar seguro de tener una grieta en la secuencia de comandos de consola se ha publicado la próxima vez que ejecute en XML problemas.
  3. 0

    Ok, así que finalmente me funcionó lo que me estaba haciendo mal. Como el xml me fue la recuperación fue de un webservice, y me había limitado la información sobre ella, he utilizado los siguientes para escribir el xml a la página para que yo pudiera ver cómo estaba estructurado.

    Response.Write oXMLHttp.ResponseXml.xml

    Por alguna razón(tal vez alguien podría llenar esta parte) que escribió todas las etiquetas XML en minúsculas. Resulta que después de investigar un poco, y después de hacer la siguiente me enteré de que esta no era la verdad!

    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

    Como se puede ver el ‘nombre de nodo de propiedad de la salida muestra las etiquetas que se pueden camel case. Así que ResponseXML fue bastante engañoso y ver XPath es sensible a mayúsculas y minúsculas se me impide la selección de los Nodos en cuestión.

Dejar respuesta

Please enter your comment!
Please enter your name here