Pregunta

Tengo algo de código Java que valida XML con un XSD. Estoy usando una versión modificada del Error Handler encontrar aquí: http: // www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html para la captura y registrar todas las excepciones al validar.

Los errores son muy concisa, se ven algo como esto:

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

Otros mensajes tales como

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

son aún más críptico.

¿Hay una manera fácil de obtener un mensaje claro e inteligible de SAX explicar lo que salió mal? Creo que en el primer error que estaba esperando txn y en su lugar se encontró el elemento cID. PERO ... No sé todos los posibles errores que podrían ser generados por SAX así que prefiero no tratar de crear manualmente una tabla de traducción.

Las eventuales usuarios de esta salida son en su mayoría de carácter no técnico así que tengo que ser capaz de generar mensajes sencillos y claros como "txn elemento fue fuera de secuencia".

Si ayuda, aquí está el código (más o menos) que se utiliza para la validación:

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

En otra parte ...

StreamSource xmlSource = new StreamSource(new StringReader(XMLData) );
try
{
    validator.validate(xmlSource);
}
catch (SAXException e)
{
    logger.error("XML Validation Error: ",e);
}
¿Fue útil?

Solución

Bueno, parece que he tenido que añadir xsi:schemaLocation="http://www.mycompany.com/schema resources/schema1.xsd " al documento XML, porque s:http://www.mycompany.com/schema es el espacio de nombres por defecto: xmlns="s:http://www.mycompany.com/schema". Por supuesto, no tengo acceso a modificar la herramienta que genera el XML, por lo que este truco feo era necesario:

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

... por supuesto, ahora que estoy recibiendo errores de validación dobles! A una clara e inteligible, tales como:

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.

seguido inmediatamente por:

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

El doble error es molesto, pero al menos la primera es utilizable ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top