Mi entrada es un documento XML bien formado y el correspondiente documento de esquema XML. Lo que me gustaría hacer es determinar la ubicación dentro del documento XML que hace que falle la validación en el documento de esquema XML. No podía encontrar la manera de hacer esto utilizando el enfoque de validación estándar en Java:Programar de forma automática qué nodo de un documento XML provocó la falla de la validación de su esquema XML
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(... /* the .xsd source */);
Validator validator = schema.newValidator();
DocumentBuilderFactory ...
DocumentBuilder ...
Document document = DocumentBuilder.parse(... /* the .xml source */);
try {
validator.validate(new DOMSource(document));
...
} catch (SAXParseException e) {
...
}
que han jugado con la idea de conseguir, al menos, el número de línea y la columna de SAXParseException, pero siempre está listo para - 1, -1 en el error de validación
También lo he intentado. También devuelve -1 para fila y columna: excepción de error: cvc-complex-type.3.2.2: El atributo 'xsi: noNamespaceSchemaLocation' no puede aparecer en el elemento 'shiporder'., Línea: -1, columna: -1 excepción de error: cvc-datatype-valid.1.2.1: 'asdf9.90' no es un valor válido para 'decimal'., Línea: -1, columna: -1 excepción de error: cvc-type.3.1 .3: El valor 'asdf9.90' del elemento 'precio' no es válido., Línea: -1, columna: -1 – user360603
Quiere decir que los métodos de error() y warning() en ErrorHandler se pasan -1 en el información de excepción? Eso es extraño, no debería estar sucediendo. ¿Quizás intentes una implementación de analizador de SAX diferente? – xcut
Tienes razón, con DOM no lo son, con SAX sí lo son. Sin embargo, con los números de línea y columna, tengo el problema de trabajar hacia atrás a través de una secuencia de caracteres para encontrar el nodo o atributo que falló. Además, el número de columna parece ser el final de la etiqueta de cerrar y no sé si ese podría ser siempre el caso con cada implementación de analizador. – user360603