VBScript和loadXML:在文档的顶级无效。怎么解决?

时间:2012-06-16 08:56:19

标签: vbscript xmldom

这是我在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中)。

提前致谢,

萨姆

2 个答案:

答案 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)成为第二个最佳选择。