ASP Classic - XML Dom
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
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 -> 10; Google Apps etc etc.
Updated on June 21, 2020Comments
-
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.