2012-07-29 36 views
7

Ich versuche, eine XML-Datei gegen eine XSD-Datei mit MSXML 6.0-DOM zu überprüfen, aber den Code auf der Ausführung erhalte ich diese Fehlermeldung:MSXML VBA: Überprüfen von XML gegen XSD: "Der bereitgestellte Namespace unterscheidet sich vom targetNamespace des Schemas."

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

eine stark vereinfachte Versionen des .XML und .XSD Dateien erzeugen auch den gleichen Fehler:

XML-Datei

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

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

Um die XML-Datei zu validieren ich in VBA (Excel 2010) diesen Code geschrieben bin mit:

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 

Die XSD-Datei geändert werden kann, aber die XML-Datei muss unantastbar bleiben.

Ich habe versucht, dieses Problem für mehr als 8 Stunden ohne positives Ergebnis zu lösen.

Jede Hilfe wird sehr geschätzt.

Antwort

11

Versuchen Sie, den Namespace-URI dem Schemacache hinzuzufügen.

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 
+0

Danke Tomalak. Nachdem du einige Teile deines Codes in meinen angepasst hast, funktioniert es jetzt wie ein Zauber. :) –

+0

@DavidGrant Gut zu hören! – Tomalak

+0

+1 für eine gute Antwort. –

1

Sie sollten nichts in Ihrem xml/xsd ändern müssen, da sie zusammen gültig sind. Das Problem ist in Ihrem Code, so würde ich vorschlagen, einen Blick auf this sample, die zeigt, was ich denke, ist anders als Ihr Code: Wenn Sie die XSD in den Cache hinzufügen, verwenden Sie den Ziel-Namespace http://somewhere.com/root anstelle der leeren Zeichenfolge.

+0

Danke Petru. Sie haben mit Recht auf die Art des Problems hingewiesen. :) –