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

用户3451965

我正在针对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

我收到的错误是:

运行时错误“ 429”:ActiveX组件无法创建对象

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

亚伯

尽管您还没有给出错误,但我会猜测这是一个参考错误,因为您可以在实例化行上得到它。

这篇MSDN帖子显示了如何在VBA中引用Office 2010的MSXML 4.0添加引用后,您的代码应像在Access 2007中一样工作。

编辑:您说您收到错误429,它确实表明无法创建该对象。您使用MSXML 4.0,默认情况下并非在每个Windows系统上都安装了MSXML 4.0。您说您引用了MSXML 6.0,在这种情况下,您应该更新代码以反映此情况:

Set objXSD = New MSXML2.DOMDocument60

您的代码中可能还有其他地方需要应用此类更改。提示:表示“ 40”时表示“ 4.0”,不表示时表示“ 3.0”,表示“ 60”时表示“ 6.0”。如果要使代码在任何最新的Windows系统上运行,请避免使用3.0和6.0以外的任何其他版本。

这是SO的一个很好的答案,解释了为什么以及何时应该选择什么版本的MSXML

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

XSD文件,用于验证Access数据宏的XML源代码

来自分类Dev

XSD文件,用于验证Access数据宏的XML源代码

来自分类Dev

在Visual Basic 2010上的INSERT INTO命令上获取语法错误到MS ACCESS 2007

来自分类Dev

表单验证规则MS-Access 2007

来自分类Dev

表单验证规则MS-Access 2007

来自分类Dev

Access 2007问题

来自分类Dev

链接到SQL Server 2008表的Access 2010-无法更改tabledef.connection到SQL Server身份验证DSN-Less

来自分类Dev

无效使用空值Access 2007

来自分类Dev

Access 2010参数查询-AND OR

来自分类Dev

从Java``插入''Access 2010

来自分类Dev

Access 2010表单查询

来自分类Dev

MS Access验证规则

来自分类Dev

使用VBA的Access 2010 Building中的报表

来自分类Dev

Postgres到MS Access

来自分类Dev

Postgres到MS Access

来自分类Dev

无法从Access 2007调用SQL Server存储的proc

来自分类Dev

Access 2010报表中的要点

来自分类Dev

在Access 2010中锁定表

来自分类Dev

Access 2010限制查询结果

来自分类Dev

Access 2010总和错误的结果

来自分类Dev

导出MS Access 2010 SQL

来自分类Dev

Access 2010-SubReports间距

来自分类Dev

Access 2010记录作为参数

来自分类Dev

Keycloak:使用PHP验证access_token

来自分类Dev

单击链接使用getelementsbyclassname vba 7使用Access 2007

来自分类Dev

在Access中使用FindNext

来自分类Dev

导入数据时阻止Access 2007使用科学计数法

来自分类Dev

在Access 2007中使用VB自动提交HTML表单

来自分类Dev

如何在Access中使用Excel的(2007)趋势功能?