Анализ ответа YouTube Server.XMLHTTP с помощью ASP Classic

Я пытаюсь проанализировать ответ xml с YouTube, но я полностью заблокирован, хе-хе.

Ну, что у меня есть до сих пор, это:

<%

    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 для решения проблемы, но мне не удалось поместить каждый узел в переменные.

Спасибо за вашу помощь!


person Community    schedule 25.08.2009    source источник


Ответы (2)


Сначала вам нужно настроить пространство имен, так как без него вы не сможете выполнять запросы 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!

person Darrel Miller    schedule 26.08.2009
comment
сделай нам всем одолжение и перестань использовать классический ASP, это бесполезно. Это служит только тому, чтобы заставить OP и других из нас, кто все еще использует его по различным хорошим коммерческим причинам, чувствовать себя плохо. Ясно, что лучшие из нас перестали бы использовать ASP. В качестве задачи перепишите свой код выше на .NET и продемонстрируйте, как это будет лучше? - person AnthonyWJones; 26.08.2009
comment
Я все еще поддерживаю 500 000 строк кода VB6. Я не пытался унизить человека, просто слегка подтолкнуть его, если в его любимом проекте используется язык, который он уже знает! Я достаточно поработал с XML как в VB6, так и в .Net, чтобы знать, что библиотеки .Net значительно лучше. - person Darrel Miller; 26.08.2009
comment
@Darrel: Достаточно честно. Если вы имеете в виду новый материал Linq-To-XML, я бы с вами согласился. Однако стандартная реализация DOM в .NET привела бы к очень похожему коду, который уже был опубликован, на самом деле он был бы более громоздким, чем это существующее решение на основе MSXML. - person AnthonyWJones; 26.08.2009
comment
@AnthonyWJones Вы правы в том, что интерфейс для XmlDocument не намного лучше, чем DOMDocument, однако катастрофа MSXML2,3,4 (sp1,2,3,4), 5, 6 и т. д. делает использование XML на основе COM parser гораздо менее приятное занятие. - person Darrel Miller; 26.08.2009

Этот код предполагает, что XmlHttp распознает application/atom+xml как тип mime XML, и, следовательно, 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
person AnthonyWJones    schedule 26.08.2009
comment
Привет. Я получаю сообщение об ошибке: ошибка msxml3.dll «80004005» Отсутствует обязательный пробел. Что бы это могло быть? Большое спасибо! - person ; 26.08.2009
comment
Нужно было заканчивать переменные ns дополнительным пробелом, я изменил ответ. - person AnthonyWJones; 26.08.2009