MSXML VBA:根据 XSD 验证 XML:“提供的 '' 命名空间与架构的 targetNamespace 不同。”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11708492/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-06 13:37:48  来源:igfitidea点击:

MSXML VBA: Validating XML against XSD: "The '' namespace provided differs from the schema's targetNamespace."

xmlvbadomxsdmsxml

提问by David Grant

I'm trying to validate an .XML file against an .XSD file with MSXML 6.0 DOM but on executing the code I'm getting this error message:

我正在尝试使用 MSXML 6.0 DOM 针对 .XSD 文件验证 .XML 文件,但在执行代码时,我收到此错误消息:

Test.xsd#/schema/targetNamespace[1]
"The '' namespace provided differs from the schema's 'http://somewhere.com/root' targetNamespace."

A heavily simplified versions of the .XML and .XSD files also produce the same error:

.XML 和 .XSD 文件的高度简化版本也会产生相同的错误:

XML FILE

XML文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:noderoot xmlns:ns2="http://somewhere.com/root">
    <general>
        <year>2011</year>
        <month>02</month>
    </general> 
</ns2:noderoot>

XSD FILE

XSD 文件

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://somewhere.com/root" 
            targetNamespace="http://somewhere.com/root" 
            xmlns:xs="http://www.w3.org/2001/XMLSchema" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            elementFormDefault="unqualified" 
            attributeFormDefault="unqualified">

    <xs:complexType name="TYPE_nodeGeneral">
        <xs:sequence>
            <xs:element name="year">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:length value="4"/>
                        <xs:pattern value="\d{4}"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="month">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:length value="2"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>           

    <xs:complexType name="TYPE_noderoot">
        <xs:sequence>
            <xs:element name="general" type="TYPE_nodeGeneral"></xs:element>            
        </xs:sequence>
    </xs:complexType>

    <xs:element name="noderoot" type="TYPE_noderoot"></xs:element>

</xs:schema>

In order to validate the XML file I'm using this code written in VBA (Excel 2010):

为了验证 XML 文件,我使用了用 VBA (Excel 2010) 编写的代码:

Sub XSD_Validation()

   XML_FILE = "I:\Test.xml"    
   XSD_FILE = "I:\Test.xsd"

    Dim xmlDoc As MSXML2.DOMDocument60
    Set xmlDoc = New MSXML2.DOMDocument60
    xmlDoc.async = False
    xmlDoc.validateOnParse = False
    xmlDoc.resolveExternals = False

    xmlDoc.Load XML_FILE

    ' Open XSD file
    Dim obXSD As MSXML2.DOMDocument60
    Set objXSD = New MSXML2.DOMDocument60
    objXSD.async = False
    objXSD.Load XSD_FILE

    ' Populate schema cache
    Dim objSchemaCache As XMLSchemaCache60
    Set objSchemaCache = New MSXML2.XMLSchemaCache60
    objSchemaCache.Add "", objXSD

    ' XSD XML Bind
    Set xmlDoc.Schemas = objSchemaCache

    'Error visualization
    Dim objErr As MSXML2.IXMLDOMParseError
    Set objErr = xmlDoc.Validate()
    If objErr.errorCode <> 0 Then
        Debug.Print "Error parser: " & objErr.errorCode & "; " & objErr.reason
    Else
        Debug.Print "No errors found"
    End If

    Set objErr = Nothing
    Set objXSD = Nothing
    Set objSchemaCache = Nothing
    Set xmlDoc = Nothing

End Sub

The XSD file can be modified but the XML file must remain untouchable.

XSD 文件可以修改,但 XML 文件必须保持不可更改。

I've been trying to solve this issue for more than 8 hours with no positive result.

我已经尝试解决这个问题超过 8 个小时,但没有任何积极的结果。

Any help will be greatly appreciated.

任何帮助将不胜感激。

回答by Tomalak

Try adding the namespace URI to the schema cache.

尝试将命名空间 URI 添加到架构缓存。

Sub XSD_Validation()
    Dim xmlDoc As MSXML2.DOMDocument60
    Dim objSchemaCache As New XMLSchemaCache60
    Dim objErr As MSXML2.IXMLDOMParseError

    objSchemaCache.Add "http://somewhere.com/root", LoadXmlFile("I:\Test.xsd")

    Set xmlDoc = LoadXmlFile("I:\Test.xml")
    Set xmlDoc.Schemas = objSchemaCache

    Set objErr = xmlDoc.Validate()
    If objErr.errorCode = 0 Then
        Debug.Print "No errors found"
    Else
        Debug.Print "Error parser: " & objErr.errorCode & "; " & objErr.reason
    End If
End Sub

Function LoadXmlFile(Path As String) As MSXML2.DOMDocument60
    Set LoadXmlFile = New MSXML2.DOMDocument60

    With LoadXmlFile
        .async = False
        .validateOnParse = False
        .resolveExternals = False
        .load Path
    End With
End Function

回答by Petru Gardea

You shouldn't have to change anything in your xml/xsd, since together they are valid. The problem is in your code, so I would suggest to take a look at this samplethat shows what I think is different than your code: when you add the XSD to the cache, use the target namespace http://somewhere.com/rootinstead of the empty string.

您不必更改 xml/xsd 中的任何内容,因为它们一起是有效的。问题出在您的代码中,因此我建议查看此示例该示例显示了我认为与您的代码不同的内容:将 XSD 添加到缓存时,请使用目标命名空间http://somewhere.com/ root而不是空字符串。