ASP Classic - XML Dom

35,050

Solution 1

Yeah, having to work in classic ASP occasionally transports me back to the Stone age too... I feel your pain!

IIRC, in your second code snippet, you just need to add :

for each node in childNodes
  Response.Write node.nodeName & "  =  " & node.text & "<br />" & vbCrLf
  '***Add the following:
  For Each att in node.Attributes
    Response.Write att.Name & "  =  " & att.text & "<br />" & vbCrLf
  Next
next

Solution 2

Switch to using xpath instead and it will be much easier.

Dim nodes
nodes = objXML.selectNodes( "//products" )

Dim images

For each node in nodes
    Response.Write( "<ul>" )
    Response.Write( "<li>Ref: " + node.selectNodes( "@ref" ).Text + "</li>" )
    images = node.selectNodes( "images/image" )
    For each image in images
        Response.Write( "<li>Image: " + image.selectNodes( "@ref" ).Text + "</li>" )
    Next
    Response.Write( "</ul>" )
Next

I'm a JScript ASP coder, like you not done VBScript for an age so the above "might" need a bit of polish (I had to strip out all the ";" at the end of the all the lines, such is the habit of adding them) but should point you in the right direction at least.

Hope that helps.

Solution 3

Try the following command to get the attribute value specifically for the image node:

node.Attributes.getNamedItem("ref").Text 
Share:
35,050
Chris McKee
Author by

Chris McKee

Software Engineer, Security guy, Open Source contributor, C#; .net (1.1 - core), Redis, EventStore, Algolia, ElasticSearch; MongoDB, CQRS + Event Sourcing; DDD, RabbitMQ, Python, Go, DevOps, Ubuntu, JavaScript, AWS, HTML; XML/XSL/XSD; PHP; MySQL; MSSQL; SQLITE; LINQ; BASH; NGINX; LUA; CentOS; Docker, Terraform/Packer/Ansible CAI, Win 3.1 -&gt; 10; Google Apps etc etc.

Updated on June 21, 2020

Comments

  • Chris McKee
    Chris McKee almost 4 years

    I've got the unpleasurable task of working on a Classic ASP site (VBSCRIPT) and need to parse out the following information in a loop.

    <xml>
      <product ref="xxx">
        <xxx/>
        <xxx/>
        <xxx/>
        <images>
          <image ref="JCCCCCC" />
          <image ref="JCCCCCD" />
        </images>
      </product>
      <product ref="xxx">
        <xxx/>
        <xxx/>
        <xxx/>
        <images>
          <image ref="JCCCCCC" />
          <image ref="JCCCCCD" />
        </images>
      </product>
    </xml>
    

    I'm trying to grab the product refs and then the images (4th main node down)

    I've been faffing with this for a while now and am suffering brain block after not using ASP for over 2 years.

    <%
     Set objXML = Server.CreateObject("Microsoft.XMLDOM")
     Set objLst = Server.CreateObject("Microsoft.XMLDOM")
     Set objHdl = Server.CreateObject("Microsoft.XMLDOM")
    
     objXML.async = False
     objXML.Load (Server.MapPath("\") & "\xmlupdate\product.xml")
    
     If objXML.parseError.errorCode <> 0 Then
         'handle the error
     End If
    
     Set objLst = objXML.getElementsByTagName("Product")
     SizeofObject = objLst.length-1
     response.Write(SizeofObject&"<br><br>")
    
     For i = 0 To (SizeofObject-1)
    
        Set objHnd = objLst.item(i)
        Response.Write(objHdl.childNodes(0).text)
     Next
    
    %>
    

    Any help would be great before I lose my mind to ASP

    --- Additional ---

    Using this provides a full output as I'd hope its the node attributes I cant seem to grab.

    <%
    Set objLst = objXML.getElementsByTagName("Product")
    SizeofObject = objLst.length-1
    response.Write(SizeofObject&"<br><br>")
    
    
    For each elem in objLst
        set childNodes = elem.childNodes
        for each node in childNodes
            Response.Write node.nodeName & "  =  " & node.text & "<br />" & vbCrLf
        next
        Response.Write "<hr>" & vbCrLf
    Next
    %>
    

    Final Code To Dump the XML (Cerebrus Below)

    <%
    Set objLst = objXML.getElementsByTagName("Product")
    SizeofObject = objLst.length-1
    response.Write(SizeofObject&"<br><br>")
    
    
    For each elem in objLst
        set childNodes = elem.childNodes
        for each node in childNodes
            
            Response.Write node.nodeName & "  =  " & node.text & "<br />" & vbCrLf
            If lcase(node.nodeName)="images" then 
                Response.Write("<B>Images Hit</B></br>")
                set xattchildnodes = node.childNodes
                For Each attchildnodes in xattchildnodes
                    For Each att in attchildnodes.Attributes
                        Response.Write att.Name & "  =  " & att.text & "<br />" & vbCrLf
                    Next
                Next
            End If
        next
        Response.Write "<hr>" & vbCrLf
    Next
    
    
    %>
    

    Working XPATH Version (modified from Pete Duncanson Below)

    <%
    Set objXML = Server.CreateObject("Microsoft.XMLDOM")
    objXML.Load (Server.MapPath("\") & "\Product.xml")
    'etc'
    
    Dim nodes
    set nodes = objXML.selectNodes("//xml/Product")
    
    Dim images
    
    For each node in nodes
        Response.Write("<ul>")
        Response.Write("<li>Ref: " & node.getAttribute("ref") & "</li>")
        Set images = node.selectNodes("Images/Image")
        For each image in images
           Response.Write( "<li>Image:"& image.getAttribute("ref") &"</li>" )
        Next
        Response.Write( "</ul>" )
    Next
    
    
    %>
    

    Anthony Jones points out that its better to be specific so you may want to change

    Set objXML = Server.CreateObject("Microsoft.XMLDOM")
    

    to

    Set objXML = Server.CreateObject("MSXML2.DOMDocument.3.0")
    

    Which still works with the final code.