Adding a child to an XML document using classic ASP

I have the following asp-classic code that adds 3 variables to an XML document: "location_x", "location_y" and "date_and_time".

ASP-Classic Code - Creates or adds an existing XML document.

Function LoadObjecttoXML(strXMLFilePath, strFileName) Dim objDom Dim objGpx Dim objWpt Dim objRte Dim objRtept Dim objDateTime Dim objattLat Dim objattLon Dim objPI Dim blnFileExists 'Instantiate the Microsoft XMLDOM Set objDom = server.CreateObject("Microsoft.XMLDOM") objDom.preserveWhiteSpace = True blnFileExists = objDom.Load(strXMLFilePath & "\" & strFileName) If blnFileExists = True Then Set objGpx = objDom.documentElement Else 'GPX root element and append it to the XML document. Set objGpx = objDom.createElement("gpx") objDom.appendChild objGpx End If Set objWpt = objDom.createElement("wpt") 'Create "Lat" attribute' Set objattLat = objDom.createAttribute("lat") objattLat.Text = (location_x) objWpt.setAttributeNode objattLat 'Create "Lon" attribute' Set objattLon = objDom.createAttribute("lon") objattLon.Text = (location_y) objWpt.setAttributeNode objattLon 'Create "date_and_time" element' Set objDateTime = objDom.createElement("time") objDateTime.Text = (date_and_time) 'Append "wpt" element as a child container element "gpx".' objGpx.appendChild objWpt 'Append the "time" element as a child of the "wpt" element' objWpt.appendChild objDateTime 'Append "rte" element only once' If blnFileExists = True Then Set objRte = objDom.documentElement Else Set objRte = objDom.createElement("rte") objGpx.appendChild objRte End If Set objRtept = objDom.createElement("rtept") 'Create "Lat" attribute' Set objattLat = objDom.createAttribute("lat") objattLat.Text = (location_x) objRtept.setAttributeNode objattLat 'Create "Lon" attribute' Set objattLon = objDom.createAttribute("lon") objattLon.Text = (location_y) objRtept.setAttributeNode objattLon 'Create "date_and_time" element' Set objDateTime = objDom.createElement("time") objDateTime.Text = (date_and_time) 'Append "rtept" element as a child container element "rte".' objRte.appendChild objRtept 'Append the "time" element as a child of the "rtept" element' objRtept.appendChild objDateTime If blnFileExists = False Then 'Create the xml processing instruction - and append to XML file Set objPI = objDom.createProcessingInstruction("xml", "version='1.0'") objDom.insertBefore objPI, objDom.childNodes(0) End If 'Save the XML document. objDom.save strXMLFilePath & "\" & strFileName Set objDom = Nothing Set objGpx = Nothing Set objWpt = Nothing Set objRte = Nothing Set objRtept = Nothing Set objDateTime = Nothing Set objattLat = Nothing Set objattLon = Nothing Set objPI = Nothing Set blnFileExists = Nothing End Function On Error Resume Next 'File path c:\ LoadObjecttoXML "c:\Inetpub\wwwroot\xml","doc.xml" 'error check If err.number <> 0 then Response.write("Error: " & err.number ) Else Response.write("Success!") End If 

The problem is that when I add variables a second time, the added XML does not fit inside the correct elements.

For example, the XML code will look something like the one shown in the first appendix:

 <gpx> <wpt lat="52.000" lon="-1.000"> <time>2016-09-23 23:38:00</time> </wpt> <rte> <rtept lat="52.000" lon="-1.000"> <time>2016-09-23 23:38:00</time> </rtept> </rte> </gpx> 

When I add a second time:

 <gpx> <wpt lat="52.000" lon="-1.000"> <time>2016-09-23 23:38:00</time> </wpt> <rte> <rtept lat="52.000" lon="-1.000"> <time>2016-09-23 23:38:00</time> </rtept> </rte> <wpt lat="52.100" lon="-1.100"> <time>2016-09-23 23:39:00</time> </wpt> <rte> <rtept lat="52.100" lon="-1.100"> <time>2016-09-23 23:39:00</time> </rtept> </rte> </gpx> 

I would like to add XML as follows:

 <gpx> <wpt lat="52.000" lon="-1.000"> <time>2016-09-23 23:38:00</time> </wpt> <wpt lat="52.100" lon="-1.100"> <time>2016-09-23 23:39:00</time> </wpt> <rte> <rtept lat="52.000" lon="-1.000"> <time>2016-09-23 23:38:00</time> </rtept> <rtept lat="52.100" lon="-1.100"> <time>2016-09-23 23:39:00</time> </rtept> </rte> </gpx> 

I would like to hear any suggestions; hints or tips about how I could achieve this.

+6
source share
1 answer

Checking blnFileExists useless and not related to rte . First remove the next part.

 'Append "rte" element only once' If blnFileExists = True Then Set objRte = objDom.documentElement Else Set objRte = objDom.createElement("rte") objGpx.appendChild objRte End If 

Instead, you need to make sure that the document has rte .

To check if a node exists, you can use selectSingleNode . It just returns the first matched object. If the nodes do not match the expression, returns Nothing .

 'Append "rte" element only once' Set objRte = objGpx.SelectSingleNode("rte") If objRte Is Nothing Then ' rte does not exist Set objRte = objDom.createElement("rte") objGpx.appendChild objRte End If 

Update # 1

ASP file:

 <% ' junk variables required in the function Dim location_x, location_y, date_and_time location_x = 56 location_y = 43 date_and_time = Now 'calling function twice 'will result an example.xml file near the asp file LoadObjecttoXML Server.Mappath("."), "example.xml" LoadObjecttoXML Server.Mappath("."), "example.xml" Function LoadObjecttoXML(strXMLFilePath, strFileName) Dim objDom Dim objGpx Dim objWpt Dim objRte Dim objRtept Dim objDateTime Dim objattLat Dim objattLon Dim objPI Dim blnFileExists 'Instantiate the Microsoft XMLDOM Set objDom = server.CreateObject("Microsoft.XMLDOM") objDom.preserveWhiteSpace = True blnFileExists = objDom.Load(strXMLFilePath & "\" & strFileName) If blnFileExists = True Then Set objGpx = objDom.documentElement Else 'GPX root element and append it to the XML document. Set objGpx = objDom.createElement("gpx") objDom.appendChild objGpx End If Set objWpt = objDom.createElement("wpt") 'Create "Lat" attribute' Set objattLat = objDom.createAttribute("lat") objattLat.Text = (location_x) objWpt.setAttributeNode objattLat 'Create "Lon" attribute' Set objattLon = objDom.createAttribute("lon") objattLon.Text = (location_y) objWpt.setAttributeNode objattLon 'Create "date_and_time" element' Set objDateTime = objDom.createElement("time") objDateTime.Text = (date_and_time) 'Append "wpt" element as a child container element "gpx".' objGpx.appendChild objWpt 'Append the "time" element as a child of the "wpt" element' objWpt.appendChild objDateTime 'Append "rte" element only once' Set objRte = objGpx.SelectSingleNode("rte") If objRte Is Nothing Then ' rte does not exist Set objRte = objDom.createElement("rte") objGpx.appendChild objRte End If Set objRtept = objDom.createElement("rtept") 'Create "Lat" attribute' Set objattLat = objDom.createAttribute("lat") objattLat.Text = (location_x) objRtept.setAttributeNode objattLat 'Create "Lon" attribute' Set objattLon = objDom.createAttribute("lon") objattLon.Text = (location_y) objRtept.setAttributeNode objattLon 'Create "date_and_time" element' Set objDateTime = objDom.createElement("time") objDateTime.Text = (date_and_time) 'Append "rtept" element as a child container element "rte".' objRte.appendChild objRtept 'Append the "time" element as a child of the "rtept" element' objRtept.appendChild objDateTime If blnFileExists = False Then 'Create the xml processing instruction - and append to XML file Set objPI = objDom.createProcessingInstruction("xml", "version='1.0'") objDom.insertBefore objPI, objDom.childNodes(0) End If 'Save the XML document. objDom.save strXMLFilePath & "\" & strFileName Set objDom = Nothing Set objGpx = Nothing Set objWpt = Nothing Set objRte = Nothing Set objRtept = Nothing Set objDateTime = Nothing Set objattLat = Nothing Set objattLon = Nothing Set objPI = Nothing Set blnFileExists = Nothing End Function %> 

example.xml Output (previously disabled manually):

 <?xml version="1.0"?> <gpx> <wpt lat="56" lon="43"> <time>26.09.2016 16:08:49</time> </wpt> <rte> <rtept lat="56" lon="43"> <time>26.09.2016 16:08:49</time> </rtept> <rtept lat="56" lon="43"> <time>26.09.2016 16:08:49</time> </rtept> </rte> <wpt lat="56" lon="43"> <time>26.09.2016 16:08:49</time> </wpt> </gpx> 
+1
source

All Articles