使用 XSD 验证 XML 从 Access 2007 移植到 2010 失败
Porting from Access 2007 to 2010 fails on validating an XML using an XSD
我正在根据 XSD 验证 XML。
这是我用过的函数:
Public Function ValidaXML(ByVal strXMLPath As String, _
ByVal strXSDPath As String) As Boolean
Dim objSchemas As MSXML2.XMLSchemaCache40
Dim objXML As MSXML2.DOMDocument40
Dim objXSD As MSXML2.DOMDocument40
Dim strNamespace As String
Dim objErr As MSXML2.IXMLDOMParseError
' load XSD as DOM to populate in Schema Cache
Set objXSD = New MSXML2.DOMDocument40
objXSD.async = False
If Not objXSD.Load(strXSDPath) Then
Err.Raise 1, "ValidaXML", "Load XSD failed: " & objXSD.parseError.reason
Else
' get namespace name from XSD targetNamespace attribute
strNamespace = objXSD.documentElement.getAttribute("targetNamespace")
End If
' populate schema cache
Set objSchemas = New MSXML2.XMLSchemaCache40
objSchemas.Add strNamespace, objXSD
' load XML file (without validation - that comes later)
Set objXML = New MSXML2.DOMDocument40
objXML.async = False
objXML.validateOnParse = False
objXML.resolveExternals = False
' load XML, without any validation
If Not objXML.Load(strXMLPath) Then
Err.Raise 1, "ValidaXML", "Load XML failed: " & objXML.parseError.reason
End If
' bind Schema Cache to DOM
Set objXML.schemas = objSchemas
' does this XML measure up?
Set objErr = objXML.Validate()
' any good?
ValidaXML = (objErr.errorCode = 0)
If objErr.errorCode <> 0 Then
Err.Raise 1, "ValidaXML", objErr.reason
End If
End Function
我使用的指令是:
Private Sub valida_Click()
Call ValidaXML("C:\xq10\q19\recibos.xml", "C:\xq10\xml\pain.008.001.02.xsd")
End Sub
在 Microsoft Access 2007 中,该功能运行正常。但是当我使用 Access 2010 时,第一行出现错误:
Set objXSD = New MSXML2.DOMDocument40
我收到的错误是:
Run-time error '429': ActiveX component can't create object
非常感谢您提供的任何帮助。
虽然您(还)没有给出错误,但我猜测这是一个引用错误,因为您在实例化行上得到了它。
这个MSDN post shows how to reference MSXML 4.0 for Office 2010 in VBA。添加引用后,您的代码应该像在 Access 2007 中一样工作。
Edit: 你说你收到错误429,这确实表明无法创建对象。您使用 MSXML 4.0,默认情况下并未安装在每个 Windows 系统上。你说你引用了 MSXML 6.0,在这种情况下你应该更新你的代码以反映这一点:
Set objXSD = New MSXML2.DOMDocument60
您的代码中可能还有其他地方需要应用此类更改。提示:当它说“40”时,表示“4.0”,当它什么都不说时,表示“3.0”,当它说“60”时,表示“6.0”。如果您希望您的代码在任何最近的 Windows 系统上 运行,请避免使用 3.0 和 6.0 以外的任何其他版本。
这是对 SO 的一个很好的解释 why and when you should choose what version of MSXML。
我正在根据 XSD 验证 XML。
这是我用过的函数:
Public Function ValidaXML(ByVal strXMLPath As String, _
ByVal strXSDPath As String) As Boolean
Dim objSchemas As MSXML2.XMLSchemaCache40
Dim objXML As MSXML2.DOMDocument40
Dim objXSD As MSXML2.DOMDocument40
Dim strNamespace As String
Dim objErr As MSXML2.IXMLDOMParseError
' load XSD as DOM to populate in Schema Cache
Set objXSD = New MSXML2.DOMDocument40
objXSD.async = False
If Not objXSD.Load(strXSDPath) Then
Err.Raise 1, "ValidaXML", "Load XSD failed: " & objXSD.parseError.reason
Else
' get namespace name from XSD targetNamespace attribute
strNamespace = objXSD.documentElement.getAttribute("targetNamespace")
End If
' populate schema cache
Set objSchemas = New MSXML2.XMLSchemaCache40
objSchemas.Add strNamespace, objXSD
' load XML file (without validation - that comes later)
Set objXML = New MSXML2.DOMDocument40
objXML.async = False
objXML.validateOnParse = False
objXML.resolveExternals = False
' load XML, without any validation
If Not objXML.Load(strXMLPath) Then
Err.Raise 1, "ValidaXML", "Load XML failed: " & objXML.parseError.reason
End If
' bind Schema Cache to DOM
Set objXML.schemas = objSchemas
' does this XML measure up?
Set objErr = objXML.Validate()
' any good?
ValidaXML = (objErr.errorCode = 0)
If objErr.errorCode <> 0 Then
Err.Raise 1, "ValidaXML", objErr.reason
End If
End Function
我使用的指令是:
Private Sub valida_Click()
Call ValidaXML("C:\xq10\q19\recibos.xml", "C:\xq10\xml\pain.008.001.02.xsd")
End Sub
在 Microsoft Access 2007 中,该功能运行正常。但是当我使用 Access 2010 时,第一行出现错误:
Set objXSD = New MSXML2.DOMDocument40
我收到的错误是:
Run-time error '429': ActiveX component can't create object
非常感谢您提供的任何帮助。
虽然您(还)没有给出错误,但我猜测这是一个引用错误,因为您在实例化行上得到了它。
这个MSDN post shows how to reference MSXML 4.0 for Office 2010 in VBA。添加引用后,您的代码应该像在 Access 2007 中一样工作。
Edit: 你说你收到错误429,这确实表明无法创建对象。您使用 MSXML 4.0,默认情况下并未安装在每个 Windows 系统上。你说你引用了 MSXML 6.0,在这种情况下你应该更新你的代码以反映这一点:
Set objXSD = New MSXML2.DOMDocument60
您的代码中可能还有其他地方需要应用此类更改。提示:当它说“40”时,表示“4.0”,当它什么都不说时,表示“3.0”,当它说“60”时,表示“6.0”。如果您希望您的代码在任何最近的 Windows 系统上 运行,请避免使用 3.0 和 6.0 以外的任何其他版本。
这是对 SO 的一个很好的解释 why and when you should choose what version of MSXML。