read parser manage library leer example create java xml

parser - Descompresión de caracteres XML no válidos en Java



manage xml java (6)

Tengo un archivo XML que es el resultado de una base de datos. Estoy usando el analizador Java SAX para analizar el XML y sacarlo en un formato diferente. El XML contiene algunos caracteres no válidos y el analizador arroja errores como ''carácter Unicode inválido (0x5)''

¿Hay una buena manera de quitar todos estos caracteres además de preprocesar el archivo línea por línea y reemplazarlos? Hasta ahora me he encontrado con 3 diferentes caracteres inválidos (0x5, 0x6 y 0x7). Es un volcado de base de datos de ~ 4 gb y vamos a procesarlo un montón de veces, por lo que tener que esperar 30 minutos adicionales cada vez que obtengamos un nuevo volcado para ejecutar un preprocesador será un dolor, y esta no es la primera vez que me encuentro con este problema.


¿Es posible que los caracteres no válidos estén presentes solo dentro de los valores y no las etiquetas en sí, es decir, el XML se corresponde con el esquema pero los valores no se han desinfectado correctamente? Si es así, ¿qué hay sobre anular InputStream para crear un CleansingInputStream que reemplace tus caracteres inválidos con sus equivalentes XML?


No he usado esto personalmente, pero Atlassian creó un limpiador XML de línea de comandos que puede adaptarse a sus necesidades (se hizo principalmente para JIRA pero XML es XML):

Descargar atlassian-xml-cleaner-0.1.jar

Abra una consola o un shell DOS y ubique el archivo de copia de seguridad XML o ZIP en su computadora, que se supone que se llama data.xml

Ejecute: java -jar atlassian-xml-cleaner-0.1.jar data.xml> data-clean.xml

Esto escribirá una copia de data.xml a data-clean.xml, con los caracteres no válidos eliminados.


Su problema no concierne a XML: se trata de codificaciones de caracteres. Lo que se reduce a esto es que cada cadena, ya sea XML u otra, consiste en bytes y no puede saber qué caracteres representan estos bytes, a menos que le digan qué carácter tiene la cadena. Si, por ejemplo, el proveedor le dice que es UTF-8 y en realidad es otra cosa, seguramente tendrá problemas. En el mejor de los casos, todo funciona, pero algunos bytes se traducen en caracteres "incorrectos". En el peor de los casos, obtienes errores como el que encontraste.

En realidad, su problema es aún peor: su cadena contiene secuencias de bytes que no representan caracteres en ninguna codificación de caracteres. No existe una herramienta de manejo de textos, y mucho menos un analizador XML, que pueda ayudarlo aquí. Esto necesita limpieza de nivel de byte.


Uso la siguiente expresión regular que parece funcionar como se esperaba para el JDK6:

Pattern INVALID_XML_CHARS = Pattern.compile("[^//u0009//u000A//u000D//u0020-//uD7FF//uE000-//uFFFD/uD800/uDC00-/uDBFF/uDFFF]"); ... INVALID_XML_CHARS.matcher(stringToCleanup).replaceAll("");

En JDK7 podría ser posible usar la notación /x{10000}-/x{10FFFF} para el último rango que se encuentra fuera del BMP en lugar de la /uD800/uDC00-/uDBFF/uDFFF que no es tan simple de entender.


Utilicé Xalan org.apache.xml.utils.XMLChar class:

public static String stripInvalidXmlCharacters(String input) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char c = input.charAt(i); if (XMLChar.isValid(c)) { sb.append(c); } } return sb.toString(); }


Tengo un problema similar al analizar el contenido de las tarifas de exportación australianas en un documento XML. No puedo usar las soluciones sugeridas aquí, como: - Usar una herramienta externa (un jar) invocada desde la línea de comandos. - Pedir a la aduana australiana que limpie el archivo fuente.

El único método para resolver este problema en este momento es iterar a través del contenido completo del archivo de origen, carácter por carácter y probar si cada carácter no pertenece al rango de ascii 0x00 a 0x1F inclusive. Se puede hacer, pero me preguntaba si existe una forma mejor de usar métodos Java para el tipo String.

EDITAR Encontré una solución que puede ser útil para otros: use el método Java String # ReplaceAll para reemplazar o eliminar cualquier carácter indeseable en un documento XML.

Código de ejemplo (eliminé algunas declaraciones necesarias para evitar el desorden):

BufferedReader reader = null; ... String line = reader.readLine().replaceAll("[//x00-//x1F]", "");

En este ejemplo, elimino (es decir, reemplazo con una cadena vacía), caracteres no imprimibles dentro del rango 0x00 a 0x1F inclusive. Puede cambiar el segundo argumento en el método #replaceAll () para reemplazar caracteres con la cadena que requiere su aplicación.