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?
¿Podría comprobar en el encabezado XML, qué conjunto de caracteres se define en él después de ordenar? ¿Es UTF-8? – JMelnik
No hay conjunto de caracteres definido en el encabezado XML, solo Xml version = "1.0"?>. Pero he puesto esto: 'm.setProperty (Marshaller.JAXB_ENCODING," UTF-8 ");' – oliverwood