2 votos

¿Cómo escapar de un carácter no válido (0x1F) en un archivo XML?

Quiero convertir un archivo XML a otra cosa. Sin embargo, cuando intento leerlo usando el FeatureReader, me da un error. Estoy usando FME Workbench 2021.2, y leo el archivo sin ningún parámetro especial. Aquí está una parte del archivo de registro:

Creating reader for format: XML (Extensible Markup Language)
Trying to find a DYNAMIC plugin for reader named `XML'
Loaded module 'XML' from file 'A_Particular_Disk:\Apps\FME2021.2.4\plugins/XML.dll'
FME API version of module 'XML' matches current internal version (3.8 20210302)
...
XML Parser error: 'Error in input dataset: '\\Some\User\With\A\Data\Directory\large_file.xml' line: 9073245 column: 41 message: invalid character 0x1F'

Hay un carácter inválido en alguna línea del archivo. Es un hexadecimal 0x1F que intenté sustituir con Python, pero no funcionó. Como se trata de un archivo bastante grande, no puedo eliminar manualmente el carácter no válido.

¿Hay alguna forma de escapar o reemplazar un carácter no válido al leer un archivo XML en FME?

2voto

Berend Puntos 587

Si realmente hay un 0x1F en el archivo XML, efectivamente no es válido, y deberías pedir a quien lo haya producido que lo corrija.

Ahora bien, eso no siempre es posible o práctico, así que puede que tengas que arreglarlo tú mismo. No sé acerca de FME, pero Python definitivamente debe ser capaz de hacer esto.

Yo lo haría de forma genérica, así: Leer el archivo XML en bloques de, digamos, 1.000.000 bytes, y hacer una búsqueda de 0x1F . Si está ahí, sustituye este único byte por (la representación en bytes de)  : 0x26 0x23 0x78 0x31 0x46 0x3B .

Podría ser posible leer el archivo línea por línea, lo que facilitaría un poco la búsqueda y sustitución, ya que se puede trabajar con cadenas en lugar de bytes. Pero técnicamente, todo el documento podría estar en una sola línea, lo que requeriría más memoria. Para este archivo en particular, este no parece ser el caso, sin embargo, hace referencia a la línea 9073245. Si se trata de una cosa de una sola vez, probablemente usaría este enfoque.

1voto

Tom Klino Puntos 142

En realidad, su verdadera tarea consiste en convertir un archivo no XML en un archivo XML.

Al hacerlo, tienes que decidir qué hacer con el personaje x1F. ¿Qué significa? ¿Quizá forma parte de un fragmento de datos binarios que hay que conservar? En ese caso, tendrá que convertir todo el fragmento a una representación que funcione en XML, como la codificación base64. O quizá sea ruido que puede descartarse sin problemas, en cuyo caso tu tarea es más sencilla.

Pero en XML 1.0 no hay una forma directa de representar un carácter x1F que funcione de forma independiente de la aplicación, por lo que hay que pensar en el problema de extremo a extremo: ¿qué información se está transmitiendo y por qué está mal codificada de esta forma? A menos que se trate de ruido que pueda descartarse, hay que rediseñar el flujo de datos de forma que afecte tanto al emisor como al receptor.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X