2009-04-07 14 views
13

Valino contra XMLSchema en Java, y obtengo SAXParseExceptions cuando tengo modelos de contenido no válidos.Cómo usar SAXParseException de manera efectiva en Java

Voy a utilizar estas excepciones para resaltar dónde ha fallado la validación, pero las SAXParseExceptions parecen tener un nivel demasiado bajo.

Por ejemplo, en el caso de una falla en una enumeración, aparece el error de validez de que el valor proporcionado no coincide con el modelo de contenido en una excepción y el elemento al que se aplica en la siguiente.

Estoy pensando que necesito tener una utilidad que resuma un poco para unir los errores relacionados y analizar el texto de excepción en propiedades de excepción utilizables.

¿Es este un enfoque razonable, o simplemente me falta algo, o tal vez una biblioteca o clase de ayuda?


Actualizar @timgilbert, gracias por la respuesta.

Por ejemplo, un SAXParseException que conocer en t'internet

cvc-pattern-valid: Value 'en' is not facet-valid 
with respect to pattern '([a-zA-Z]{1,8})(-[a-zA-Z0-9]{1,8})*' 

Las cosas claves para mí son

  • Elemento 'es' al que se aplica esta excepción. ¿Por qué no puedo llamar a exception.getElement() o algo así, y por qué no un XPath para el elemento en cuestión? ¡Más útil con un documento en memoria que el número de línea y columna!
  • Es un error de validación de patrón. ¿Por qué no puedo obtener algo así como una enumeración de posibles tipos de falla y una referencia a la adecuada?
  • El patrón real en el que falló la validación.
  • habrá otra excepción lanzada junto a decirme el valor del elemento 'es' que causó el problema que necesito para combinar

Un ejemplo de lo que me gustaría ser capaz de hacer es que las personas envíen un documento y el documento se destaque donde la validación falla con un mensaje fácil de usar: el mensaje de error de arriba no parece muy amigable ... tener que analizar por comillas simples parece un accidente esperando que ocurra :)

Creo que tal vez estoy haciendo mal con la cosa 'referencia-a-elemento', y tal vez debería tener una transformación de identidad del documento por defecto como parte de la validación, y augmen t la transformación con atributos de validación-error que puedo elegir con CSS. Eso aún no ayudará si necesito analizar los mensajes para hacerlos más amigables ...

Re: tight binding, javax.xml.validation.Validator.validate() throws org.xml.sax.SAXException de todos modos - no estoy seguro de cómo puedo conseguir lejos de asumir la unión ...

Saludos

+1

+1, acabo de encontrar el mismo tipo de problema esta mañana. gracias por publicar. –

+1

¡No hay problema, me alegro de que no sea solo que soy tonto! – Brabster

+0

Tengo un problema muy similar. ¿Encontró una solución que hace que sea más fácil hacer que estos errores sean más fáciles de usar? – Turismo

Respuesta

2

no estoy del todo claro acerca de lo que está pidiendo aquí, tal vez usted podría ofrecer un poco más de detalle acerca de lo que ¿Quiere decir que las excepciones son de muy bajo nivel? ¿Es que los mensajes de error en sí mismos no son comprensibles?

La clase SaxParseException tiene los métodos getColumnNumber() y getLineNumber() que puede presentar al usuario para que solucione los errores.

Una cosa con la que puedes experimentar es utilizar diferentes implementaciones de análisis XML: cada analizador arrojará un error cuando encuentre un código no válido, pero diferentes implementaciones pueden tener diferentes mensajes de error y cadenas de excepción.

En realidad, por esta razón dudaría si intento crear una biblioteca que inspeccione la cadena de excepción e intente generar un mensaje de error más coherente, ya que estaría acoplando su código con bastante precisión. detalles específicos de una implementación de análisis XML (especialmente si confía en la verborrea específica de los mensajes de error).

(En este momento esto no es más específica, tal vez usted podría dar un ejemplo del problema que se está viendo?)

1

Brabster yo también enfrenté al problema similar camino de regreso donde necesito saber con qué elemento el xml ha venido el error. Resolví un poco el problema al mantener una pila en mi controlador de SAX Parser. En el método startElement, presiono qName (nombre del elemento) en la pila y, en el método endElement, saco el qName de la pila.

Siempre que llega una excepción, mi pila representa el XPath completo del elemento.

El único problema es que si hay varios elementos con el mismo nombre, entonces no sabe cuál es el error para cada elemento. Pero al menos los detalles completos de XPath ayudaron junto con LineNumber y ColumnNumber.

Espero que esto ayude.

Cuestiones relacionadas