Frage

Ich habe einige Java-Code, XML gegen eine XSD validiert. Ich verwende eine modifizierte Version des Error Handler hier: http: // www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html zu fangen und alle Ausnahmen anmelden, während zu validieren.

Die Fehler sind sehr kurz und bündig, sie in etwa so aussehen:

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.myschema.com/schema":txn}

Weitere Meldungen wie

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:attributes&{"http://www.myschema.com/schema":sequence}

sind noch kryptisch.

Gibt es einen einfachen Weg, um eine klare und verständliche Botschaft von SAX erklärt zu bekommen, was hier schief gelaufen ist? Ich denke, in den ersten Fehlern es erwartet txn und stattdessen das Element cID gefunden. ABER ... Ich weiß nicht, alle möglichen Fehler, die von SAX erzeugt werden könnten, so würde ich lieber nicht versuchen, manuell eine Übersetzungstabelle zu erstellen.

Die eventuellen Nutzer dieser Ausgabe sind meist nicht-technische, damit ich muß in der Lage sein, erzeugen einfache und klare Botschaften wie „Element txn war außer der Reihe“.

Wenn es hilft, hier ist der Code (mehr oder weniger), die für die Validierung verwendet wird:

Source schema1 = new StreamSource(new File("resources/schema1.xsd"));
Source schema2 = new StreamSource(new File("resources/schema2.xsd"));
Source[] sources = {schema1,schema2};
validator = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(sources).newValidator();
ErrorHandler lenient = new ForgivingErrorHandler();
validator.setErrorHandler(lenient);

An anderer Stelle ...

StreamSource xmlSource = new StreamSource(new StringReader(XMLData) );
try
{
    validator.validate(xmlSource);
}
catch (SAXException e)
{
    logger.error("XML Validation Error: ",e);
}
War es hilfreich?

Lösung

Nun, es scheint, dass ich xsi:schemaLocation="http://www.mycompany.com/schema resources/schema1.xsd " in das XML-Dokument hinzuzufügen hatte, weil s:http://www.mycompany.com/schema der Namespace Standard ist: xmlns="s:http://www.mycompany.com/schema". Natürlich habe ich nicht den Zugang des Werkzeugs zu ändern, die die XML erzeugt, so dass die folgende hässliche Hack war notwendig:

xmlDataStr = xmlDataStr.replace("<rootNode ", "<rootNode xsi:schemaLocation=\"http://www.mycompany.com/schema resources/schema1.xsd \" ");

... natürlich jetzt erhalte ich doppelte Validierungsfehler! Eine klare und verständliche ein wie:

cvc-complex-type.2.4.a: Invalid content was found starting with element 's:cID'. One of '{"http://www.mycompany.ca/schema":tdr}' is expected.

Unmittelbar gefolgt von:

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.mycompany.com/schema":tdr}

Der Doppel-Fehler ist ärgerlich, aber zumindest die erste ist verwendbar ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top