Domanda

Ho qualche codice Java che convalida XML contro un XSD. Sto usando una versione modificata del Error Handler trovato qui: http: // www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html per catturare e registrare tutte le eccezioni durante la convalida.

Gli errori sono molto stringato, sembrano qualcosa di simile:

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

Altri messaggi come

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

sono ancora più criptico.

C'è un modo facile per ottenere un messaggio chiaro e comprensibile di SAX spiegare che cosa è andato male qui? Penso che nel primo errore si aspettava txn e invece ha trovato l'elemento cID. MA ... non so tutti i possibili errori che potrebbero essere generati da SAX quindi preferirei non cerco di creare manualmente una tabella di traduzione.

Gli eventuali utilizzatori di questa uscita sono per lo più non tecnico quindi ho bisogno di essere in grado generare messaggi semplici e chiari, come "elemento txn era fuori sequenza".

Se aiuta, ecco il codice (più o meno) che viene utilizzato per la convalida:

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);

Altrove ...

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

Soluzione

Bene, sembra ho dovuto aggiungere xsi:schemaLocation="http://www.mycompany.com/schema resources/schema1.xsd " al documento XML, perché s:http://www.mycompany.com/schema è lo spazio dei nomi di default: xmlns="s:http://www.mycompany.com/schema". Naturalmente, non ho accesso per modificare lo strumento che genera il codice XML, in modo che il seguente brutto hack era necessario:

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

... ovviamente ora sto ottenendo gli errori di validazione doppie! A una chiara e comprensibile come ad esempio:

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.

immediatamente seguito da:

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

Il doppio errore è fastidioso, ma almeno il primo è la forza ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top