2010-06-07 10 views
5

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

Respuesta

0

No obtendrá los errores de validación del esquema informados de esta manera. Si realmente quiere línea y la información de la columna, es necesario configurar un controlador de errores, es decir

try { 
    validator.setErrorHandler(handler); 
    validator.validate(...); 
} catch (SAXParseException e) { 
    // Use handler info, or log it in handler 
} 

Esta es la unión que necesita para poner en práctica: ErrorHandler

+0

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

+0

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

+0

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

1

A DOM no retiene información sobre su origen; en la mayoría de los casos, es irrelevante, y DOM está destinado a ser manipulado (es decir, cualquier información de ubicación sería incorrecta).

La solución es validar en el momento de analizar: llame al DocumentBuilderFactory.setSchema() antes de crear el DocumentBuilder.

Cuestiones relacionadas