3

这是我在 stackoverflow 上的堡垒帖子。我在这个网站上搜索了许多类似的问答,但我的情况似乎有点不同。这是我的 vbscript 代码:

------------ 代码片段 ----------------

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 中的隐藏字符)。我似乎无法弄清楚出了什么问题。这是一个简单的 XML 文件。我可以使用 perl 正则表达式在几分钟内解析它,但我需要在 Windows 上运行这个脚本,所以使用 vbscript。我使用相同的技术从其他来源解析 XML,没有任何问题。不幸的是,我无法修改 XML,它来自外部来源。我的 Windows Vista 家庭版和 Windows Server 2008 都出现了同样的错误。到目前为止,我正在从命令行运行 vbscript 进行测试(即不在 ASP 中)。

提前致谢,

山姆

4

2 回答 2

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")
于 2012-06-16T09:22:11.407 回答
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 的)成为第二好的选择。

于 2012-06-16T23:17:11.023 回答