2010-05-11 14 views
7

Estoy usando Java DocumentBuilder.parse(InputStream) para analizar un documento XML. Ocasionalmente, recibo documentos XML con formato incorrecto en el sentido de que hay basura adicional después del > final que causa un SAXException: Content is not allowed in trailing section. (En los casos que he visto, la basura es simplemente uno o más bytes nulos.)Ignorando "El contenido no está permitido en la sección final" SAXException

No me importa lo que está después de la final >. ¿Existe una manera fácil de analizar un documento XML completo en Java y hacer que ignore cualquier basura al final?

Tenga en cuenta que por "ignorar" no me refiero simplemente a atrapar e ignorar la excepción: me refiero a ignorar la basura arrastrada, no arrojar ninguna excepción, y devolver el objeto Document desde el XML hasta un incluyendo el final > es válido.

Respuesta

8

Como su remitente le presenta un XML no válido, debe corregirse antes de que llegue al analizador si desea evitar esta excepción. Si no puede corregir al remitente, necesitará un paso de preprocesamiento de algún tipo.

Si la situación es simplemente que tiene bytes nulos adicionales después de la etiqueta de cierre como indeciso por una de sus respuestas a otra respuesta, esto podría ser algo que puede lograr fácilmente envolviendo su flujo de entrada en un FilterInputStream que implementar para omitir bytes nulos.

Si el problema es más complejo que solo caracteres nulos, por supuesto necesitarás un filtro más complejo, lo que puede ser difícil.

Si está utilizando un ContentHandler, puede agregar una devolución de llamada para que pueda informar el código de llamada cuando se haya manejado la etiqueta raíz final, y basado en ese conocimiento, el código de llamada puede tener lógica en su manejador de la excepción para simplemente ignorarlo si el final ha sido señalado. ¡En ese momento, todo lo que tenía que hacer el analizador probablemente se haya hecho de todos modos! Pero esta solución no parece aplicarse a su situación.

-5

No. Un documento que contiene caracteres finales no es un documento XML. Corrige el remitente.

+3

No tengo control sobre el remitente. Y su "respuesta" no está en el espíritu de "Sé liberal en lo que aceptas y estricto en lo que emites". –

+0

Usted preguntó "¿hay alguna manera fácil de analizar un documento XML completo en Java y hacer que ignore cualquier basura arrastrada?" La respuesta es "no, no hay", y di la razón. ¿Quizás estás buscando http://home.ccil.org/~cowan/XML/tagsoup/? ¿Quizás sepa que su XML no tiene CDATA y puede implementar un contenedor primitivo inputStream? No estoy seguro de qué respuesta estás buscando. –

+0

Cada analizador XML realiza un seguimiento de cada elemento y sabe cuándo dicho elemento se ha "cerrado" al analizar el> de su etiqueta de cierre. Eso significa que cada analizador de XML también conoce el final> cuando lo ve porque el primer elemento ha sido equilibrado por su etiqueta de cierre. En ese punto, quiero que el analizador simplemente se detenga. Estás haciendo esto más complicado de lo que es. –

Cuestiones relacionadas