XML non valide Personnage Pendant Unmarshall

Je suis ordonnancement des objets de fichier XML en utilisant l'encodage "UTF-8". Il génère des fichiers avec succès. Mais quand j'essaie de unmarshal en arrière, il y a une erreur:

Un fichier XML non valide de caractères (Unicode:
0x{2}) a été trouvé dans la valeur de
l'attribut "{1}" et de l'élément est "0"

Le personnage est 0x1A ou \u001a, ce qui est valable en UTF-8, mais illégal en XML. Marshaller dans JAXB permet l'écriture de ce personnage dans un fichier XML, mais Unmarshaller ne peut pas analyser le dos. J'ai essayé d'utiliser un autre encodage (UTF-16, ASCII, etc), mais toujours l'erreur.

La solution courante est de supprimer/remplacer ce caractère non valide avant d'analyse XML. Mais si nous avons besoin de ce caractère, la façon d'obtenir le caractère original après unmarshalling?


Alors que la recherche de cette solution, je veux remplacer les caractères non valides avec un caractère de substitution (par exemple dot = ".") avant unmarshalling.

J'ai créé cette classe:

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;
    }
 }

Alors c'est comment je l'ai lu et unmarshall le fichier:

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

En quelque sorte le lecteur de ne pas remplacer des caractères non valides avec le personnage que je veux. Il en résulte un mal de données XML qui ne peut pas être unmarshalled. Est-il quelque chose de mal avec mon InvalidXMLCharacterFilterReader classe?

Pourriez-vous s'il vous plaît vérifier en-tête XML, quel jeu de caractères est définie dans l'après triage? C'est de l'UTF-8?
Il n'y a pas de jeu de caractères défini dans l'en-tête XML, seulement <?xml version="1.0" ?>. Mais j'ai mis ceci: m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

OriginalL'auteur oliverwood | 2011-04-28