ASP经典-XML Dom

Chr*_*Kee 5 xml vbscript asp-classic

我有一个经典的ASP网站(VBSCRIPT)上无法完成的任务,需要循环解析以下信息。

<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>
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取产品参考,然后获取图像(第四个主节点向下)

我已经对此感到迷恋了一段时间,并且在两年多的时间里没有使用ASP之后一直处于大脑阻塞的状态。

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

%>
Run Code Online (Sandbox Code Playgroud)

在我不介意使用ASP之前,任何帮助都会非常有用

---附加-

使用此功能可提供完整的输出,因为我希望它似乎无法抓住其节点属性。

<%
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
%>
Run Code Online (Sandbox Code Playgroud)

转储XML的最终代码(下面的Cerebrus)

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


%>
Run Code Online (Sandbox Code Playgroud)

工作的XPATH版本(从下面的Pete Duncanson修改)

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


%>
Run Code Online (Sandbox Code Playgroud)

安东尼·琼斯(Anthony Jones)指出,最好具体一点,以便您可能需要更改

Set objXML = Server.CreateObject("Microsoft.XMLDOM")
Run Code Online (Sandbox Code Playgroud)

Set objXML = Server.CreateObject("MSXML2.DOMDocument.3.0")
Run Code Online (Sandbox Code Playgroud)

仍然适用于最终代码。

Cer*_*rus 5

是的,有时必须使用经典ASP才能使我回到石器时代……我感到您很痛苦!

IIRC,在第二个代码段中,您只需添加:

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
Run Code Online (Sandbox Code Playgroud)