这是我在stackoverflow上的帖子。我在这个网站上搜索了很多类似的Q& A,但我的情况看起来有点不同。这是我的vbscript代码:
------------ code snippet ---------------
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中)。
提前致谢,
萨姆
答案 0 :(得分:3)
xmlDoc.loadXML()
可以加载XML字符串。它无法检索网址。
如果需要发出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")
答案 1 :(得分:2)
另外三条评论:
(1)由于.parseError.reason往往含糊不清,因此包含其.srcTxt是值得的。 property(和.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)成为第二个最佳选择。