2011-04-28 34 views
9

Estoy organizando objetos en un archivo XML utilizando la codificación "UTF-8". Genera archivo con éxito. Pero cuando trato de deserializar de nuevo, hay un error:Carácter XML no válido durante Unmarshall

An invalid XML character (Unicode: 0x{2}) was found in the value of attribute "{1}" and element is "0"

El personaje es 0x1A o \ u001a, que es válido en UTF-8, pero ilegal en XML. Marshaller en JAXB permite escribir este personaje en un archivo XML, pero Unmarshaller no puede analizarlo. Intenté usar otra codificación (UTF-16, ASCII, etc.) pero todavía error.

La solución común es eliminar/reemplazar este carácter no válido antes del análisis XML. Pero si necesitamos recuperar este personaje, ¿cómo obtener el personaje original después de quitarle la marca?


bien en busca de esta solución, quiero reemplazar los caracteres no válidos con un carácter sustitutivo (por ejemplo, puntos = "") antes de unmarshalling.

he creado esta clase:

public class InvalidXMLCharacterFilterReader extends FilterReader { 

    public static final char substitute = '.'; 

    public InvalidXMLCharacterFilterReader(Reader in) { 
     super(in); 
    } 

    @Override 
    public int read(char[] cbuf, int off, int len) throws IOException { 

     int read = super.read(cbuf, off, len); 

     if (read == -1) 
      return -1; 

     for (int readPos = off; readPos < off + read; readPos++) { 
      if(!isValid(cbuf[readPos])) { 
        cbuf[readPos] = substitute; 
      } 
     } 

     return readPos - off + 1; 
    } 

    public boolean isValid(char c) { 
     if((c == 0x9) 
       || (c == 0xA) 
       || (c == 0xD) 
       || ((c >= 0x20) && (c <= 0xD7FF)) 
       || ((c >= 0xE000) && (c <= 0xFFFD)) 
       || ((c >= 0x10000) && (c <= 0x10FFFF))) 
     { 
      return true; 
     } else 
      return false; 
    } 
} 

Entonces esta es la forma en que leo y Resolver referencia del archivo:

FileReader fileReader = new FileReader(this.getFile()); 
Reader reader = new InvalidXMLCharacterFilterReader(fileReader); 
Object o = (Object)um.unmarshal(reader); 

De alguna manera el lector no reemplaza caracteres no válidos con el personaje que quiero. Resulta un dato XML incorrecto que no se puede separar. ¿Hay algún problema con mi clase InvalidXMLCharacterFilterReader?

+0

¿Podría comprobar en el encabezado XML, qué conjunto de caracteres se define en él después de ordenar? ¿Es UTF-8? – JMelnik

+0

No hay conjunto de caracteres definido en el encabezado XML, solo . Pero he puesto esto: 'm.setProperty (Marshaller.JAXB_ENCODING," UTF-8 ");' – oliverwood

Respuesta

1

Creo que el problema principal es escapando caracteres ilegales durante el marshalling. Algo similar fue mencionado here, podrías probarlo.

Ofrece a cambiar la codificación a Unicode marshaller.setProperty("jaxb.encoding", "Unicode");

+1

Traté de escapar caracteres ilegales durante la clasificación como se menciona allí, que está transformando el carácter "0x1a" en la referencia de caracteres "$ # x1a ; " y cambié la codificación a "Unicode", pero todavía recibí un error durante la eliminación de clasificaciones: _Character reference "& # x1A" es un carácter XML no válido. – oliverwood

2

El carácter Unicode U + 001A es illegal in XML 1.0:

La codificación que se utiliza para representar que no importa en este caso, simplemente no es permitido en el contenido XML.

XML 1.1 allows some of the restricted characters (incluyendo U + 001A) que se incluirán, pero debe estar presente como referencias de caracteres numéricos (&#x1a;)

Wikipedia tiene a nice summary of the situation.

+0

¿Sabes cómo configurar la propiedad Marshaller para tener un encabezado XML 1.1? Intenté este pero no funcionó: 'm.setProperty (" com.sun.xml.bind.xmlHeaders "," ");' – oliverwood

+1

Parece que JAXB no todavía soporto XML 1.1: http://java.net/jira/browse/JAXB-422 –

+1

No creo que el personaje ofensivo sea 0x02, tenga en cuenta las llaves alrededor de {2} y {1}, esto se ve más al igual que los marcadores de posición en el mensaje de error no fueron reemplazados. –

Cuestiones relacionadas