2012-07-29 69 views
7

próbuję sprawdzić poprawność pliku XML przeciwko pliku .XSD z MSXML 6.0 DOM ale na wykonywanie kodu Dostaję komunikat o błędzie:MSXML VBA: Walidacja XML przeciwko XSD: " '' The przestrzeni nazw przewidzianych różni się od schematu za targetNamespace"

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

mocno uproszczone wersje .xml i pliki .XSD produkować również ten sam błąd:

pliku 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 PLIK

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

W celu walidacji pliku XML Używam tego kodu napisanego w języku 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 

Plik XSD można modyfikować ale plik XML musi pozostać nietykalne.

Próbowałem rozwiązać ten problem przez ponad 8 godzin bez pozytywnego rezultatu.

Każda pomoc zostanie bardzo doceniona.

Odpowiedz

11

spróbuj dodać URI przestrzeni nazw do pamięci podręcznej schematu.

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

Dziękuję Tomalak. Po dostosowaniu niektórych części kodu do mojego teraz działa jak urok. :) –

+0

@DavidGrant Dobrze słyszeć! – Tomalak

+0

+1 za dobrą odpowiedź. –

1

Nie powinno się niczego zmieniać w swoim XML/XSD, ponieważ razem są one ważne. Problem jest w twoim kodzie, więc sugerowałbym, aby przyjrzeć się this sample, który pokazuje, co myślę, że jest inny niż twój kod: kiedy dodasz XSD do pamięci podręcznej, użyj docelowego obszaru nazw http://somewhere.com/root zamiast pustego łańcucha.

+0

Dziękuję Petru. Miałeś rację wskazując na charakter problemu. :) –

Powiązane problemy