从Access 2007移植到2010无法使用XSD验证XML

时间:2015-09-12 13:42:37

标签: xml vba ms-access 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

我收到的错误是:

  

运行时错误&#39;&#39;:ActiveX组件无法创建对象

我非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

虽然你还没有给出错误,但我猜这是一个引用错误,因为你在实例化行上得到它。

MSDN post shows how to reference MSXML 4.0 for Office 2010 in VBA。添加引用后,您的代码应该像在Access 2007中一样工作。

编辑:您说您收到错误429,这表明无法创建对象。您使用的是默认情况下未安装在每个Windows系统上的MSXML 4.0。您说您引用的是MSXML 6.0,在这种情况下,您应该更新代码以反映这一点:

Set objXSD = New MSXML2.DOMDocument60

您的代码中可能还有其他地方需要应用此类更改。提示:当它表示&#34; 40&#34;时,它意味着&#34; 4.0&#34;,当它什么也没说时,它意味着&#34; 3.0&#34;,当它说&#34; 60&#34;,表示&#34; 6.0&#34;。如果您希望代码在任何最新的Windows系统上运行,请避免使用3.0和6.0之外的任何其他版本。

以下是解释why and when you should choose what version of MSXML的优秀答案。