在用DOMDocument object編輯XML文件時,我們應該注意XML文件中聲明信息,他們會阻礙我們編輯XML文件中的數據。
首先介紹下XMl中常出現的DTD聲明信息:
實例如下:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
分析:
這段代碼指定文件類型定義(DTD),可以通過它檢查XML文檔的有效性。下面顯示的<!DOCTYPE>元素有幾個特性,這些特性告訴我們關於DTD的信息:
● web-app定義該文檔(部署描述符,不是DTD文件)的根元素
● PUBLIC意味着DTD文件可以被公開使用
● "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"意味着DTD由Sun Microsystems, Inc.
維護。該信息也表示它描述的文檔類型是DTD Web Application 2.3,而且DTD是用英文書寫的。
● URL"http://java.sun.com/dtd/web-app_2_3.dtd"表示D文件的位置。
當包含了以上聲明後,MSXML解析器將默認的針對DTD查驗你的文檔。
對包含以上code的XML文件,創建新的DOMDocument object,在不做任何設定的情況下,解析XML文件時候會發生錯誤。需要設定resolveExternals 屬性爲false來避免這個問題。
代碼如下:
set XMLDoc = CreateObject("Msxml2.DOMDocument")
XMLDoc.resolveExternals = False
XMLDoc.async = False
XMLDoc.Load(xmlFile)
以下是本人從MSDN中翻譯的部分解釋:(原文連接:http://msdn.microsoft.com/en-us/library/ms759188(v=vs.85).aspx#Y1756)
在創建一個新的DOMDocument object時候,resolveExternals 屬性的默認值爲true。在解析的時候,它將解析外部的定義的文件幷包含在XML 文件流中。比如,以下的外部文件和可解析定義會被解析並添加到你的解析後的文檔中:
1。包含可解析的模塊化的DTD聲明的文本文件,例如實體或者命名空間
2。包含額外的規則或者模板的串型的XSD架構或者XSLT類型的表單文件
在使用中發現,有些時候“XMLDoc.resolveExternals = False”並不能完全解決解析XML文件錯誤的問題。在這個時候可以添加XMLDoc.validateOnParse = False定義,這樣就能夠完全解決XML文件解析的問題。validateOnParse 屬性決定解析器是否查驗文檔。
如果我們需要檢查解析爲什麼錯誤,我們可以調用ParseError object. 可以調用IXMLDOMParseError接口來顯示ParseError object的屬性。IXMLDOMParseError接口提供了7個屬性用來調查錯誤發生的原因。
以下示例會提供一個消息窗口顯示所有的錯誤信息
Dim xDoc As MSXML.DOMDocument
Set xDoc = New MSXML.DOMDocument
If xDoc.Load("C:/My Documents/cds.xml") Then
' The document loaded successfully.
' Now do something intersting.
Else
' The document failed to load.
Dim strErrText As String
Dim xPE As MSXML.IXMLDOMParseError
' Obtain the ParseError object
Set xPE = xDoc.parseError
With xPE
strErrText = "Your XML Document failed to load" & _
"due the following error." & vbCrLf & _
"Error #: " & .errorCode & ": " & xPE.reason & _
"Line #: " & .Line & vbCrLf & _
"Line Position: " & .linepos & vbCrLf & _
"Position In File: " & .filepos & vbCrLf & _
"Source Text: " & .srcText & vbCrLf & _
"Document URL: " & .url
End With
MsgBox strErrText, vbExclamation
End If
Set xPE = Nothing
有錯誤的地方,望高人指出。謝謝。