2012-06-16 53 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與Windows不兼容(看到一些關於此的帖子),但我仍然有同樣的錯誤。我也嘗試了unix2dos,反之亦然,以防有回車問題(嵌入在xml中的隱藏字符)。我似乎無法弄清楚什麼是錯的。這是一個simole XML文件。我可以使用perl正則表達式在幾分鐘內解析它,但我需要在Windows上運行這個腳本,所以使用VBScript。我使用相同的技術從其他來源解析XML,沒有任何問題。不幸的是,我無法修改這個XML,它來自外部。 我在Windows Vista家庭版和Windows Server 2008上都有同樣的錯誤。我從命令行運行vbscript到目前爲止進行測試(即不在ASP中)。

由於提前,

山姆

回答

3

xmlDoc.loadXML()可以加載XML字符串。它無法檢索URL。

如果您需要發出HTTP請求,請使用XMLHTTPRequest對象。

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

您的解決方案工作但稍作修改。相反的: 設置xmlDoc中= xmlhttp.ResponseXml 我修改了負載功能(HTTP GET後): xmlDoc.loadXML(xmlhttp.responseText) 非常感謝,現在我沒有更多的錯誤! 現在我只需要弄清楚如何解析節點的屬性和那個有趣的看!CDATA []的東西大聲笑。 – 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 

當然,編寫一個將.parseError 的所有屬性考慮在內並使用它的Function/Sub會更好。

(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

相關問題