ASP Classic - XML ​​Dom - PullRequest
       13

ASP Classic - XML ​​Dom

4 голосов
/ 21 мая 2009

У меня неприятная задача работать на классическом 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>

Я пытаюсь получить ссылки на продукт, а затем изображения (4-й основной узел вниз)

Я уже давно недоволен этим и страдаю от блокады мозга после того, как не использую ASP более 2 лет.

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

%>

Любая помощь будет хороша, прежде чем я сойду с ума по 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
%>

Окончательный код для сброса 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


%>

Рабочая версия 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


%>

Энтони Джонс отмечает, что лучше быть конкретным, поэтому вы можете изменить

Set objXML = Server.CreateObject("Microsoft.XMLDOM")

до

Set objXML = Server.CreateObject("MSXML2.DOMDocument.3.0")

Который все еще работает с окончательным кодом.

Ответы [ 3 ]

4 голосов
/ 21 мая 2009

Да, необходимость работать в классическом 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
2 голосов
/ 21 мая 2009

Переключитесь на использование xpath, и это будет намного проще.

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

Я - JScript ASP-кодер, как вы не делали VBScript для возраста, так что вышеприведенное «может» нужно немного отполировать (мне пришлось убрать все «;» в конце всех строк, Такова привычка добавлять их), но, по крайней мере, вы должны указывать правильное направление.

Надеюсь, это поможет.

1 голос
/ 21 мая 2009

Попробуйте следующую команду, чтобы получить значение атрибута специально для узла изображения:

node.Attributes.getNamedItem("ref").Text 
...