2010-06-14 14 views
5

Estamos analizar un documento XML utilizando JAXB y obtiene este error:Explicación del error JAXB: bytes no válida 1 de 1 byte secuencia de codificación UTF-8

[org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.] 
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315) 

Qué significa exactamente y cómo podemos resolver ¿¿esta??

Estamos ejecutando el código como:

jaxbContext = JAXBContext.newInstance(Results.class); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
unmarshaller.setSchema(getSchema()); 
results = (Results) unmarshaller.unmarshal(new FileInputStream(inputFile)); 

actualización

cuestión parece ser debido a este carácter "divertido" en el archivo XML: ¿

Por qué ¿Esto causaría tal problema?

Actualización 2

Hay dos de esos caracteres extraños en el archivo. Están alrededor del medio del archivo. Tenga en cuenta que el archivo se crea sobre la base de datos en una base de datos y esos personajes extraños de alguna manera se metieron en la base de datos.

Actualización 3

Aquí es el fragmento de XML completo:

<Description><![CDATA[Mt. Belvieu ¿ Texas]]></Description> 

Update 4

Tenga en cuenta que no hay <?xml ...?> cabecera.

La HEX para el carácter especial es BF

+1

Significa que la entrada está dañada ... no hay mucho que pueda decir sin más información. – skaffman

+0

Se agregó algo más de información. ¿Tiene algún sentido? ¡Gracias por tu ayuda! –

+1

Puede publicar la sección del archivo XML que incluye el texto ofensivo. – ChrisF

Respuesta

3

Por lo tanto, un problema es que JAXB trata los archivos XML sin <?xml ...?> cabecera como UTF-8, cuando el archivo utiliza alguna otra codificación (probablemente ISO-8859-1 o Windows-1252, si 0xBF carácter realmente quiere significar ¿) .

Si puede cambiar el productor del archivo, puede agregar el encabezado <?xml ...?> con la especificación de codificación real, o simplemente use UTF-8 para escribir un archivo.

Si no puede cambiar el productor, usted tiene que utilizar InputStreamReader con especificación de codificación explícita, ya que (por desgracia) JAXB no permiten cambiar su codificación por defecto:

results = (Results) unmarshaller.unmarshal(
    new InputStreamReader(new FileInputStream(inputFile), "ISO-8859-1")); 

Sin embargo, esta solución es frágil: falla en los archivos de entrada con el encabezado <?xml ...?> con diferentes especificaciones de codificación.

+0

Gracias, intentaré. Tenga en cuenta que obtengo el mismo error cuando uso Xalan/Java para tratar de formatear el archivo XML usando XSLT. ¿Xalan también asume UTF-8? –

+0

¡Eso funciona! Tenga en cuenta que este código solo se ejecuta en este archivo, que nunca tendrá el encabezado xml. Cuál es la ventaja/diferencia de este enfoque vs. usar esto: 'results = (Results) unmarshaller.unmarshal (new FileReader (inputFile));' –

+1

@Marcus: 'FileReader' usa la codificación predeterminada del sistema, cuando' InputStreamReader 'usa el especificado explícitamente. – axtavt

1

Eso es probablemente una Byte Order Mark (BOM), y es una secuencia de bytes especial al comienzo de un archivo UTF. Ellos son, francamente, un dolor en el trasero, y parecen particularmente comunes cuando se interactúa con sistemas .net.

Intente reformular el código para utilizar un Reader en lugar de un InputStream:

results = (Results) unmarshaller.unmarshal(new FileReader(inputFile)); 

Un Reader es UTF-consciente, y podría hacer una mejor puñalada en ella. Más simplemente, pasar el File directamente a la Unmarshaller, y dejar que el JAXBContext preocupación al respecto:

results = (Results) unmarshaller.unmarshal(inputFile); 
+0

Puedo intentarlo. Tenga en cuenta que hay dos de esos caracteres en el archivo: consulte la segunda actualización de la publicación. –

+0

El uso del 'FileReader' se ve bien. Obtuve el mismo error cuando acabo de especificar el 'Archivo'. ¡Voy a validar todos mis resultados pero esto se ve bien! –

+0

Pero, por lo que entiendo, estos simplemente parecen caracteres "extraños", no una "Marca de pedido de bytes", ¿no? ¿Por qué causan este problema? –

0

Suena como si el código XML está codificado con UTF-16, pero que la codificación no está siendo pasado a la Unmarshaller. Con el Marshaller puede configurarlo usando marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-16");, pero debido a que el Unmarshaller no es necesario para admitir ninguna propiedad, no estoy seguro de cómo hacer eso, salvo asegurar que su documento XML tenga encoding="UTF-16" en el elemento inicial <?xml?>.

+1

No puede ser UTF-16: intento de analizar el archivo XML codificado en UTF-16 porque UTF-8 fallará debido a un marcado incorrecto. Es probable que sea una codificación de un solo byte. – axtavt

+0

Tiene razón. Estaba mirando las diferentes codificaciones y me confundí. – Andy

Cuestiones relacionadas