MSXML Schema Validierung -> Warning



  • Hallo!

    Ich benutze MSXML für die Schema-Validierung eines XML mit einem XSD. Leider habe ich ein Problem mit einem speziellen Schema, das Warnungen erzeugt, wenn ich es im Visual Studio öffne. Und zwar:

    Elements with the same name and in the same scope must have the same type.

    Die gleichen Meldungen bekomme ich auch über MSXML, was mich daran hindert, das XML zu validieren.

    Der Code:

    MSXML2::IXMLDOMSchemaCollectionPtr   pXS;
    hr = pXS.CreateInstance(__uuidof(MSXML2::XMLSchemaCache60), NULL, CLSCTX_INPROC_SERVER);
    hr = pXS->add(L"namespace", _variant_t(csXSD));
    

    Die Funktion pXS->add wirft eine Exception mit den oben beschriebenen Warnungen. Gibt es eine Möglichkeit MSXML zu veranlassen, die Warnungen zu ignorieren?

    Das XSD ist nicht von mir und ich kann es auch nicht ändern.

    Danke
    Source



  • Ich verstehe Dich nicht ganz. Du beklagst Du über einen Validierungsfehler und willst es aber ignorieren!? Warum validierst Du dann?



  • Ich beklage mich nicht über einen Validierungsfehler, sondern dass für das XSD File mit dem ich validieren will, Warnungen ausgegeben werden. Diese Warnungen hindern mich daran das XML zu validieren, weil eine Exception geworfen wird.

    Da es sich aber nur um eine Warnung handelt denke ich mir, dass man die doch auch ignorieren kann. Wenn ich das selbe XML/XSD online validiere, z.B. hiermit
    http://www.corefiling.com/opensource/schemaValidate.html
    gehts auch. Dieser Validator ignoriert die Probleme im XSD.



  • Kannst Du das Problem auf ein Minimalbeispiel reduzieren?





  • Der Code entspricht im wesentlichen:

    #import <msxml6.dll>
    
    bool ValidXML(const CString &csXML, const CString &csXSD, CString &csResult){
        MSXML2::IXMLDOMSchemaCollectionPtr   pXS;
        MSXML2::IXMLDOMDocument2Ptr pXMLDoc;
        MSXML2::IXMLDOMDocument2Ptr pXMLDoc;
    
        HRESULT hr = pXS.CreateInstance(__uuidof(MSXML2::XMLSchemaCache60), NULL, CLSCTX_INPROC_SERVER);
        try{
            hr = pXS->add(L"<<namespace>>", _variant_t(csXSD));
        }catch(_com_error &x){
            // Exception hier mit Warnungen im XSD
            return false;
        }
        hr = pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER);
        pXMLDoc->async = VARIANT_FALSE;
        pXMLDoc->validateOnParse = VARIANT_TRUE;
        pXMLDoc->resolveExternals = VARIANT_TRUE;
    
        pXMLDoc->schemas = pXS.GetInterfacePtr();
        bool bValidOk = false;
        if(pXMLDoc->load(bstrFile) != VARIANT_TRUE){
            pError = pXMLDoc->parseError;
            // Hier werden dann die Probleme ausgewertet
            bValidOk = false;
        }else{
            bValidOk = true;
        }
    
        return bValidOk;
    }
    

    Die Exception passiert bei pXS->add, wobei csXSD der Pfad zum XSD-File ist. Leider darf ich das XSD nicht öffentlich zur Verfügung stellen. Wenn du dir das aber ansehen könntest, würd ich es dir per Mail schicken.

    Zu Schema falsch:
    Ja und nein. Sicherlich hat das Schema Probleme, sonst würden ja die Warnungen nicht kommen. Allerdings können, wie beschrieben, andere Validatoren damit umgehen. Und da es sich ja um keine Fehler handelt, muss es doch möglich sein die Warnungen beim Parsen des XSD zu ignorieren.



  • Warum bist Du der Meinung, dass es sich in dem XSchema um keine Fehler handelt?

    Laut der XSchema Specigikation ist es ein Fehler und keine Wanrung wenn zwei gleiche Elemente unterschiedliche Datentypen haben. Das geht nun mal mit XSchema nicht.
    Wenn es andere validatoren ignorieren, dann heisst dies noch lange nicht, dass es so korrekt ist.

    Siehe nochmals dieser Link, der vermutlich genau Dein Problem veranschaulicht:
    http://social.msdn.microsoft.com/Forums/en/xmlandnetfx/thread/3e03514c-647b-42cb-9159-e3b0f5a1be86

    Du solltest Dich mit dem Hersteller des XSchema auseinandersetzen... oder einen anderen Validator verwenden... ich kenne keinen Weg, wie man es dem MSXML beibringen könnte dies zu ignorieren...



  • Warum bist Du der Meinung, dass es sich in dem XSchema um keine Fehler handelt?

    Weil Visual Studio es als Warnung ankreidet. Ich hatte auch schon XSDs mit Fehlern. Da macht zumindest VS einen Unterschied. In der Annahme, dass auch VS MSXML nimmt, dachte ich zumindest das es einen Weg gibt dieses Warnungen zu übergehen.

    Danke für deine Hilfe, werd mal mit denen streiten. Die stehen nämlich auf dem Standpunkt, dass es so korrekt ist, weil deren Validator-Tool das akzeptiert.



  • Ohne Beispiel ist es natürlich sehr schwer zu verstehen, was wirklich im XSchem definiert ist...
    Sowas liefert in VS eine "Warnung":

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="ROOT">
            <xs:complexType>
                <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="Entry">
                        <xs:complexType>
                            <xs:attribute name="value" type="xs:unsignedByte" use="optional" />
                            <xs:attribute name="value" type="xs:string" use="optional" />
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>
    

    Aber hier liefern diverse Validierungstools auch Fehler:
    http://www.utilities-online.info/xsdvalidation/
    http://www.freeformatter.com/xml-validator-xsd.html


Anmelden zum Antworten