在经典ASP中解析高级XML

时间:2017-08-14 14:20:37

标签: xml asp-classic

我正在尝试解析以下多层XML树。我可以很容易地获得第一级,但似乎无法弄清楚如何在经过多次搜索后获得其他人。最终我们需要的是每个级别的数据的完整列表,迭代每篇文章以及获取文章ID。 有人可以帮我吗?

XML:

<search>
    <numresults>26707</numresults>
    <pagesize>20</pagesize>
    <articles>
        <article id="998">
            <title>my title 1</title>
            <url>www.google.com</url>
            <attributes>
                <performer>
                    <id>122</id>
                    <url>www.yahoo.com</url>
                    <name>Elvis</name>
                </performer>
            </attributes>
        </article>
        <article id="999">
            <title>my title 2</title>
            <url>www.microsoft.com</url>
            <attributes>
                <performer>
                    <id>123</id>
                    <url>www.aol.com</url>
                    <name>Aerosmith</name>
                </performer>
            </attributes>
        </article>
    </articles>
</search>

以下是我对XML有用的第一步:

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

objXML.async = False
objXML.setProperty "ServerHTTPRequest", true
objXML.Load (sURL)

'CaSe sensitive
Set objEvents = objXML.getElementsByTagName("article")

NumEvents = objEvents.length 'zero based

Response.Write NumEvents

c = 0
Do Until c = NumEvents

    Set objEventDetails = objEvents.item(c)

    Title = Trim(objEventDetails.childNodes(0).text)

    Response.Write Title & "<br>"

    c = c + 1

Loop 'main XML feed loop

Set objEvents = Nothing
Set objXML = Nothing

任何帮助将不胜感激!!

2 个答案:

答案 0 :(得分:0)

使用XPath而不是抓取下一个孩子。

这是一个例子

Set xml = CreateObject("Msxml2.DOMDocument")
xml.Async = "False"

xml.Load("search.xml")

strReturn = ""

for each ndArticle in xml.selectNodes( "//article" )
    strReturn = strReturn + ndArticle.getAttribute( "id" ) + vbCrLf 
    for each ndChild in ndArticle.selectNodes(".//" )
        if ndChild.nodeName <> "#text"  then
            strLast = ndChild.nodeName
        else 
            strReturn = strReturn + strLast + "=" + ndChild.nodeTypedValue + "<br/>" + vbCrLf
        end if
    next
next

WScript.Echo strReturn 

创建

998
title=my title 1<br/>
url=www.google.com<br/>
id=122<br/>
url=www.yahoo.com<br/>
name=Elvis<br/>
999
title=my title 2<br/>
url=www.microsoft.com<br/>
id=123<br/>
url=www.aol.com<br/>
name=Aerosmith<br/>

答案 1 :(得分:0)

如果其他人有这个问题,我就是这样解决的。看这篇文章:

how to solve "The download of the specified resource has failed" error?

底部的最后评论对我有用。有一个问题是调用我的URL来自与脚本相同的目录(我知道,完全忘了 - 菜鸟错误),然后抛出另一个错误“指定资源的下载失败”导致我找到这个解决方案。

我认为我的服务器上有一个安全功能阻止威廉的代码在上面工作......

感谢William的帮助!