使用ASP Classic解析Server.XMLHTTP YouTube响应

时间:2009-08-25 22:08:51

标签: xml asp-classic xmlhttprequest

我正在尝试解析来自YouTube的xml回复,但我完全被阻止了,呵呵。

嗯,直到现在我才得到的是:

<%

    Option Explicit
    Response.Buffer = True

    Dim videoVimeo, videoYoutube
        videoVimeo = "http://vimeo.com/5866977"
        videoYoutube = "http://www.youtube.com/watch?v=d8nxjUlbKJA"

'------------------------------------------------------------------
'----------------------- YouTube request --------------------------
'------------------------------------------------------------------
        ' replacing the url to get the ID from the video
        videoYoutube = Replace(videoYoutube,"http://www.youtube.com/watch?v=","")

        ' pasting the ID to the api URL provided from YouTube
        videoYoutube = "http://gdata.youtube.com/feeds/api/videos/"&videoYoutube

    Dim xml
        set xml = Server.CreateObject("Microsoft.XMLHTTP")
        set xml = Server.CreateObject("MSXML2.ServerXMLHTTP")

        xml.Open "GET", videoYoutube, False

        On Error Resume Next

        xml.Send

    Dim docXml
        Set docXml = Server.CreateObject("msxml2.DOMDocument")
            docXml.loadxml(xml.ResponseText)

    Set xml = nothing

%>

好的,从这里我不知道如何解析响应。

我想要做的是将节点保存到标题,上传日期,评级等变量中

我尝试了这个http://www.aspmessageboard.com/showthread.php?t=230539来解决问题,但我无法将每个节点都变成变量。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

首先,您需要设置命名空间,因为如果没有它,您将无法进行Xpath查询。 这可能会起作用,具体取决于服务器上安装的MSXML版本。

oXslt.setProperty "SelectionNamespaces", "xmlns:atom='http://www.w3.org/2005/Atom'"

如果这不起作用,您可能需要创建一个MXNamespaceManager

Set oNSMgr = Server.CreateObject("MSXML2.MXNamespacemanager")
oNSMgr.declarePrefix "atom", "http://www.w3.org/2005/Atom"

我不确定如何将命名空间管理器与DOMDocument相关联。也许你没必要!

要访问您的数据,您现在可以使用新的前缀进行Xpath查询。

set titlenode = docXml.SelectSingleNode("/atom:entry/atom:title")
title = titlenode.Text

set publishednode = docXml.SelectSingleNode("/atom:entry/atom:published")
publishednode  = publishednode .Text

要获得评级,您必须添加新的命名空间

xmlns:gd='http://schemas.google.com/g/2005'

并像这样得到它

set ratingnode = docXml.SelectSingleNode("/atom:entry/gd:rating")
ratingnode  = ratingnode.Text

希望有所帮助,帮助我们,并停止使用经典的ASP!

答案 1 :(得分:0)

此代码假定XmlHttp将application / atom + xml识别为XML mime类型,因此ResponseXML将加载DOM。

<%

    Option Explicit
    Response.Buffer = True

    Dim videoVimeo : videoVimeo = "http://vimeo.com/5866977"

    Dim videoYoutube : videoYoutube = "http://www.youtube.com/watch?v=d8nxjUlbKJA"

    videoYoutube = Replace(videoYoutube,"http://www.youtube.com/watch?v=","")

    videoYoutube = "http://gdata.youtube.com/feeds/api/videos/" & videoYoutube


    Dim xhr: Set xhr= Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")

    xhr.Open "GET", videoYoutube, False

    xhr.Send

    If xhr.Status = 200 Then
        Dim xml : Set xml = xhr.ResponseXML
        xml.SetProperty "SelectionLanguage", "XPath"
        Dim ns : ns = "xmlns:a='http://www.w3.org/2005/Atom' "
        ns = ns & "xmlns:gd='http://schemas.google.com/g/2005' "
        xml.SetProperty "SelectionNamespaces", ns

        Dim entry : Set entry = xml.DocumentElement

        Dim title : title = entry.SelectSingleNode("a:title").Text
        Dim published : published = entry.SelectSingleNode("a:published")
        Dim rating : rating = entry.SelectSingleNode("gd:rating").GetAttribute("average")


    End If
%>

如果mime类型未被识别为xml,则ReponseXML属性将为Nothing。在这种情况下,ResponseStream属性可用于加载DOM: -

Dim xml : Set xml = Server.CreateObject("MSXML2.DOMDocument.3.0")
xml.load xhr.ResponseStream