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

22,839

Solution 1

Try adding the namespace URI to the schema cache.

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

Solution 2

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 sample that shows what I think is different than your code: when you add the XSD to the cache, use the target namespace http://somewhere.com/root instead of the empty string.

Share:
22,839
Admin
Author by

Admin

Updated on July 09, 2022

Comments

  • Admin
    Admin almost 2 years

    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:

    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 FILE

    <?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

    <?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):

    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.

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

    Any help will be greatly appreciated.