¿Es posible obtener el número de línea actual al analizar un documento XML con Xerces?

StackOverflow https://stackoverflow.com/questions/570216

  •  05-09-2019
  •  | 
  •  

Pregunta

Tengo un programa Java que analiza un documento XML utilizando xerces API.

Mi clase de análisis se extiende org.apache.xerces.parsers.XMLDocumentParser, la sobrecarga de los startElement, endElement, métodos caracteres.

Ya que es un documento complicado XML que está escrito a mano (principalmente algún tipo de elementos de configuración), clásico de la validación de XSD o DTD no es suficiente, y tengo que volver al usuario que el documento XML no es válido.

Pero 1 cosa que no pude lograr es agregar la información de los mensajes de error sobre el número de línea (y por qué no también el número de columna) que currenlty está siendo analizada y donde se produce el error.

Lo que esto puede ser posible, porque las excepciones (org.apache.xerces.xni.parser.XMLParseException) generados por el analizador cuando el documento XML no es válido XML contienen estas informaciones.

¿Fue útil?

Solución

Nunca he intentado esto con xerces, pero analizadores SAX puede almacenar una SAX Localizador , desde donde se puede obtener los números de línea y de columna como se analiza el documento (o después de una excepción).

Parece que XMLDocumentParser puede ser capaz de hacer lo mismo. Su clase padre, AbstractXMLDocumentParser, tiene un startDocument método que se pasa un parámetro XMLLocator. Si reemplaza este método, puede guardar el XMLLocator y utilizar sus métodos getLineNumber y getColumnNumber.

Otros consejos

No está seguro de lo que sería la forma "correcta" pero mirando a la API, suponiendo que usted proporciona XMLInputSource que tiene un InputStream o un lector podría proporcionar en un InputStream / lector que se envuelve con una LineNumberInputStream o LineNumberReader y luego volver a consultar se para el número de línea.

por ejemplo:

InputStream stream;

stream = ...;

new XMLInputSource(stream);

se convertiría en:

InputStream stream;
LineNumberInputStream lineStream;

stream = ...;
lineStream = new LineNumberInputStream(lineStream);

new XMLInputSource(lineStream);

// can now ask the line stream what line it is on via getLineNumber()

Estoy adivinando que también tendría que pasar el LineNumberInputStream / LineNumberReader a su clase que se extiende XMLDocumentParser.

No estoy seguro si todo eso es factible en el código.

Como alternativa cavar en la fuente y averiguar cómo lo hacen. Si las variables / métodos que necesita para el acceso son privadas, y que no están preocupados por su código de romper en el futuro, se podría utilizar la reflexión y eliminar los permisos de acceso para llegar a ella.

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