2012-06-16 2 views
3

Это мой пост форта в stackoverflow. Я искал много похожих Q & A на этом сайте, но мои условия кажутся немного разными. вот мой VBScript код:VBScript и loadXML: недействительны на верхнем уровне документа. Как это исправить?

------------ фрагмент кода ---------------

xmlurl = "songs.xml" 

set xmlDoc = CreateObject("Microsoft.XMLDOM") 
xmlDoc.async = False 
xmlDoc.loadXML(xmlurl) 

if xmlDoc.parseError.errorcode<>0 then 
    'error handling code 
    msgbox("error! " & xmlDoc.parseError.reason) 
end if 

---- -------- конец фрагмента кода ---------------

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<nowplaying-info-list> 
    <nowplaying-info mountName="CKOIFMAAC" timestamp="1339771946" type="track"> 
    <property name="track_artist_name"><![CDATA[CKOI]]></property> 
    <property name="cue_title"><![CDATA[HITMIX]]></property> 
    </nowplaying-info> 
    <nowplaying-info mountName="CKOIFMAAC" timestamp="1339771364" type="track"> 
    <property name="track_artist_name"><![CDATA[AMYLIE]]></property> 
    <property name="cue_title"><![CDATA[LES FILLES]]></property> 
    </nowplaying-info> 
    <nowplaying-info mountName="CKOIFMAAC" timestamp="1339771149" type="track"> 
    <property name="track_artist_name"><![CDATA[MIA MARTINA]]></property> 
    <property name="cue_title"><![CDATA[TOI ET MOI]]></property> 
    </nowplaying-info> 
</nowplaying-info-list> 

Я также попытался удалить первую строку в случае, может быть UTF -8 несовместимо с окнами (видел некоторые сообщения об этом), но у меня все еще такая же ошибка. Я также пробовал unix2dos и наоборот в случае, если были проблемы с возвратом каретки (скрытые символы, встроенные в xml). Я просто не могу понять, что случилось. Это такой XML-файл simole. Я мог бы проанализировать его через несколько минут с использованием регулярного выражения perl, но мне нужно запустить этот скрипт на окнах, используя vbscript. Я использую тот же метод для анализа XML из других источников без каких-либо проблем. К сожалению, я не могу изменить XML, это из внешнего источника. У меня такая же ошибка как для моей домашней версии Windows Vista, так и для Windows Server 2008. Я запускаю vbscript из командной строки для тестирования до сих пор (т. Е. Не в ASP).

Спасибо заранее,

Сэм

ответ

3

xmlDoc.loadXML() может загрузить строку XML. Он не может получить URL-адрес.

Используйте объект XMLHTTPRequest, если вам нужно сделать HTTP-запрос.

Function LoadXml(xmlurl) 
    Dim xmlhttp 

    Set xmlhttp = CreateObject("MSXML2.XMLHTTP") 
    xmlhttp.Open "GET", xmlurl, false 

    ' switch to manual error handling 
    On Error Resume Next 

    xmlhttp.Send 
    If err.number <> 0 Then 
    WScript.Echo xmlhttp.parseError.Reason 
    Err.Clear 
    End If 

    ' switch back to automatic error handling 
    On Error Goto 0 

    Set LoadXml = xmlhttp.ResponseXml 
End Function 

Используйте как

Set doc = LoadXml("http://your.url/here") 
+0

Ваше решение работает, но с небольшими изменениями.Вместо того, чтобы: Set xmldoc = xmlhttp.ResponseXml Я изменил свою функцию загрузки (после HTTP GET): xmlDoc.loadXML (xmlhttp.responseText) Спасибо много, теперь у меня нет больше ошибок! Теперь мне просто нужно выяснить, как разбирать атрибуты узлов и что смешно смотреть! CDATA [] stuff LOL. – hacker101

+0

@ hacker101 Но почему? 'responseXML' уже является вполне допустимым объектом документа XML. Нет необходимости вообще анализировать 'responsText' * * *. Все, что вы делаете, - это создать второй объект документа, отбросив первый. – Tomalak

+1

По какой-то причине я получал сообщение об ошибке. Ты прав! Это намного лучше, меньше кода и меньше затрат времени на выполнение. здорово. Еще раз спасибо! – hacker101

2

Три аддитивные примечания:

(1) Как .parseError.reason имеет тенденцию быть загадочным, он платит, чтобы включить его свойство .srcTxt (и параметр к .loadXml):

Dim xmlurl : xmlurl = "song.xml" 
    Dim xmlDoc : Set xmlDoc = CreateObject("Microsoft.XMLDOM") 
    xmlDoc.async = False 
    xmlDoc.loadXML xmlurl 
    If 0 <> xmlDoc.parseError.errorcode Then 
    WScript.Echo xmlDoc.parseError.reason, "Src:", xmlDoc.parseError.srcText 
    Else 
    WScript.Echo "surprise, surprise" 
    End if 

выход:

Invalid at the top level of the document. 
Src: song.xml 

Конечно, написание функции/Sub, который принимает все свойства .parseError во внимание и использовать это всегда, было бы еще лучше.

(2) Для того, чтобы загрузить файл или URL, используйте .load:

Dim xmlDoc : Set xmlDoc = CreateObject("Microsoft.XMLDOM") 
    Dim xmlurl 
    For Each xmlurl In Array("song.xml", "http://gent/~eh/song.xml", "zilch") 
    xmlDoc.async = False 
    if xmlDoc.load(xmlurl) Then 
     With xmlDoc.documentElement.firstChild 
      WScript.Echo xmlurl _ 
         , .tagName _ 
         , .firstChild.tagName _ 
         , .firstChild.text 
     End With 
    Else 
     WScript.Echo xmlurl, xmlDoc.parseError.reason, "Src:", xmlDoc.parseError.srcText 
    End if 
    Next 

выход:

song.xml nowplaying-info property CKOI-ÄÖÜ 
http://gent/~eh/song.xml nowplaying-info property CKOI-ÄÖÜ 
zilch The system cannot locate the object specified. 
Src: 

(3) Использование DOM позволяет избежать всех проблем с кодировкой (именно поэтому я ставлю некоторые немецких умляутов в «ваш» файл, который даже довел до выхода DOS-Box) и делает RegExps (даже Perl's) вторым лучшим выбором.

+0

Очень хороший ответ. Спасибо за советы также (т. Е. Текст ошибки разбора). – hacker101

+0

+1. Полезные дополнения. Я не знал, что XMLDOM может загружаться с URL-адресов. – Tomalak