【问题标题】:Append child in XML document using Classic ASP使用经典 ASP 在 XML 文档中附加子项
【发布时间】:2017-02-01 21:28:03
【问题描述】:

我有以下 asp-classic 代码,它将 3 个变量附加到 XML 文档中,“location_x”、“location_y”和“date_and_time”。

ASP-Classic 代码 - 创建或附加现有的 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'
    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

我遇到的问题是当我第二次附加变量时,附加的 XML 没有放在正确的元素内。

例如,XML 代码在第一次附加时看起来像这样:

<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> 

当我第二次追加时:

<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> 

我希望 XML 像这样附加:

<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>

我很想听听任何建议;关于如何实现这一点的提示或提示。

【问题讨论】:

    标签: xml dom vbscript asp-classic gpx


    【解决方案1】:

    检查blnFileExists 是无用的,与rte 无关。先把下面的部分去掉。

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

    相反,您需要确保文档中有rte

    要检查节点是否存在,您可以使用selectSingleNode。它只是返回第一个匹配的对象。如果没有节点匹配表达式,则返回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
    

    更新 #1

    ASP 文件:

    <%
    ' 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 输出(手动美化):

    <?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>
    

    【讨论】:

    • 你能扩展你的答案吗?我已按照您的解释更改了脚本,但收到错误消息。
    • @Jonathan 错误是什么?我已经更新了答案。
    • 太完美了!
    • @Jonathan 谢谢。我添加了一些关于 selectSingleNode 的附加信息,您可能想阅读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多