在用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
有错误的地方,望高人指出。谢谢。