Link to home
Start Free TrialLog in
Avatar of WonderingWhy
WonderingWhy

asked on

Processing an XML file in ASP

Hi All

I'm attempting to process an XML file for storing into a database. I'm using a sample xml file (attached) which contains some customer data along with a list of vehicles that customer owns.

The customer can own between 1 and 3 vehicles (for the purpose of this example)

I've managed to output the data on screen, but now I need to store the data as variables. I've tried declaring each variable in my code - but as there are duplicates (when more than one vehicle exists) it is failing.

Is there anyway of numbering the returned data? i.e. First returned vehicle would be Make1, Model1 and the next would be Make2, Model2 etc? If not - is there any alternative solution?

Many thanks for your help.
********** This is my sample xml
 
<?xml version="1.0" encoding="utf-8" ?>
 
  <Remotesale>
    <Customer>
      <Title>Mr</Title>
      <Forename>Craig</Forename>
      <Surname>Bloggs</Surname>
    </Customer>
    <Vehicles>
      <Vehicle>
        <Make>Ford</Make>
        <Model>Escort</Model>
      </Vehicle>
      <Vehicle>
        <Make>Vauxhall</Make>
        <Model>Astra</Model>
      </Vehicle>
    </Vehicles>
  </Remotesale>
 
 
********** and this is my ASP code
 
<%@ Language=VBScript %>
 
<%Option Explicit%>
 
<HTML>
 
<HEAD>
 
<TITLE>Processing file</TITLE>
 
 
</HEAD>
 
 
<%
 
Dim xmlDoc
 
Dim xmlRoot
 
Dim xmlPNode
 
Dim xmlNode
 
Dim strDoc
 
Set xmlDoc = Server.CreateObject("Microsoft.xmldom")
 
xmlDoc.async = False
 
xmlDoc.load(Server.MapPath("sample.xml"))
 
Set xmlRoot = xmlDoc.documentElement
 
For Each xmlPNode In xmlRoot.childNodes
 
        
 
        If xmlPNode.childNodes.length = 0 Then
 
                strDoc = strDoc & _
 
                 "<I>No data</I>"
				 'Return failed message to MSM?
 
        Else
 
                strDoc = strDoc & "<div>"
 
                For Each xmlNode In xmlPNode.childNodes
 
						 	'Dim xmlNode.nodeName
							'xmlNode.nodeName = xmlNode.text
							
                         strDoc = strDoc & _
                         "<B>" & xmlNode.nodeName & ":</B>" & _
                          xmlNode.text + "<br />"
 
                Next
 
        End If
 
        strDoc = strDoc & "</div>"
 
Next   
 
Response.Write strDoc
 
%>
 
</BODY>
 
</HTML>

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of hielo
hielo
Flag of Wallis and Futuna image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of WonderingWhy
WonderingWhy

ASKER

That's great! How would I go about storing the vehicles into variables? I think that'll be sorted then!

(vehicle1make, vehicle1model, vehicle2make, vehicle2model, etc etc)

Thanks

<%@ Language=VBScript %>
<%Option Explicit%>
<HTML>
<HEAD>
	<TITLE>Processing file</TITLE>
</HEAD>
<%
Dim xmlDoc
Dim xmlRoot
Dim xmlPNode
Dim xmlNode
Dim strDoc
'Set xmlDoc = Server.CreateObject("Microsoft.xmldom")
Set xmlDoc = Server.CreateObject("MSXML2.DOMDocument.3.0")
 
xmlDoc.async = False
xmlDoc.load(Server.MapPath("panosms.xml"))
 
Dim title, forename, surname, vehicles
'save customer info into variables
title =  xmlDoc.selectSingleNode("/Remotesale/Customer/Title").text
forename =  xmlDoc.selectSingleNode("/Remotesale/Customer/Forename").text
surname =  xmlDoc.selectSingleNode("/Remotesale/Customer/Surname").text
 
'save the vehicles onto an array of node objects.
Set vehicles = xmlDoc.selectNodes("/Remotesale/Vehicles/Vehicle")
 
Dim vehicle1make, vehicle1model, vehicle2make, vehicle2model
vehicle1make = vehicles(0).selectSingleNode("Make").text
vehicle1model= vehicles(0).selectSingleNode("Model").text
vehicle2make = vehicles(1).selectSingleNode("Make").text
vehicle2model= vehicles(1).selectSingleNode("Model").text
 
'Write the customer info
Response.Write	title & " " & forename & " " & surname
'Print the vehicle data individually
Response.Write "<div>" & vehicle1make & " " & vehicle1model & "</div>"
Response.Write "<div>" & vehicle2make & " " & vehicle2model & "</div>"
 
%>
</BODY>
</HTML>

Open in new window

Hi Hielo

Thanks so much for your help. Points awarded.

The second solution above didn't work fully as if only 1 vehicle was included in the XML feed, it would fail - and likewise, if 3 vehicles were included, it would also fail.

Here is the solution...

<%@ Language=VBScript %>
<%Option Explicit%>
<HTML>
<HEAD>
	<TITLE>Processing file</TITLE>
</HEAD>
<%
Dim xmlDoc
Dim xmlRoot
Dim xmlPNode
Dim xmlNode
Dim strDoc
'Set xmlDoc = Server.CreateObject("Microsoft.xmldom")
Set xmlDoc = Server.CreateObject("MSXML2.DOMDocument.3.0")
 
xmlDoc.async = False
xmlDoc.load(Server.MapPath("sample.xml"))
 
Dim title, forename, surname, vehicles
'save customer info into variables
title =  xmlDoc.selectSingleNode("/Remotesale/Customer/Title").text
forename =  xmlDoc.selectSingleNode("/Remotesale/Customer/Forename").text
surname =  xmlDoc.selectSingleNode("/Remotesale/Customer/Surname").text
 
'save the vehicles onto an array of node objects.
Set vehicles = xmlDoc.selectNodes("/Remotesale/Vehicles/Vehicle")
 
'Write the customer info
Response.Write	title & " " & forename & " " & surname & "<br />"
'Print the vehicle data individually
'Response.Write "<div>" & vehicles(0).selectSingleNode("Make").text & " " & vehicles(0).selectSingleNode("Model").text & "</div>"
'Response.Write "<div>" & vehicles(1).selectSingleNode("Make").text & " " & vehicles(1).selectSingleNode("Model").text & "</div>"
 
'or iterate through array
Dim vehicleCounter
vehicleCounter = 1001
 
Dim Vehicle1Make, Vehicle1Model
Dim Vehicle2Make, Vehicle2Model
Dim Vehicle3Make, Vehicle3Model
 
Dim v
 
For Each v in vehicles
	If vehicleCounter = 1001 then
		Vehicle1Make	= v.selectSingleNode("Make").text 
		Vehicle1Model	= v.selectSingleNode("Model").text
	ElseIf vehicleCounter = 1002 then
		Vehicle2Make	= v.selectSingleNode("Make").text 
		Vehicle2Model	= v.selectSingleNode("Model").text
	ElseIf vehicleCounter = 1003 then
		Vehicle3Make	= v.selectSingleNode("Make").text 
		Vehicle3Model	= v.selectSingleNode("Model").text
	End If
	
	vehicleCounter = vehicleCounter + 1
Next
 
Response.Write Vehicle1Make & " " & Vehicle1Model & "<br />"
 
If Vehicle2Make <> "" then Response.Write Vehicle2Make & " " & Vehicle2Model & "<br />"
 
If Vehicle3Make <> "" then Response.Write Vehicle3Make & " " & Vehicle3Model & "<br />"
%>
</BODY>
</HTML>

Open in new window