Ungültige XML-Zeichen Während der Unmarshall

Ich bin marshalling von Objekten zu XML-Datei mit encoding "UTF-8". Es erzeugt die Datei erfolgreich. Aber wenn ich versuche, unmarshal es zurück, es ist ein Fehler:

Ein ungültiges XML-Zeichen (Unicode:
0x{2}) wurde gefunden im Wert von
Attribut "{1}" und element "0" ist,

Ist das Zeichen 0x1A oder \u001a, die gültig ist in UTF-8 aber illegal in XML. Marshaller in JAXB ermöglicht das schreiben dieser Zeichen in XML-Datei, aber Unmarshaller nicht analysieren kann es zurück. Ich habe versucht andere zu verwenden das encoding (UTF-16, ASCII, etc), aber immer noch Fehler.

Die gemeinsame Lösung ist das entfernen/ersetzen Sie das ungültige Zeichen vor dem XML-parsing. Aber wenn wir diese Zeichen wieder, wie man den ursprünglichen Charakter nach unmarshalling?


Während der Suche nach dieser Lösung, ich will ersetzen Sie das ungültige Zeichen durch ein Zeichen ersetzen (z.B. Punkt = ".") vor unmarshalling.

Ich habe diese Klasse:

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

Dann ist das, wie ich gelesen habe, und unmarshall die Datei:

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

Irgendwie der reader nicht ersetzen ungültige Zeichen mit den Zeichen, die ich möchte. Es ergibt sich eine falsche XML-Daten, die nicht unmarshallt werden. Gibt es etwas falsch mit meinem InvalidXMLCharacterFilterReader Klasse?

  • Könnten Sie bitte überprüfen Sie in der XML-header das charset definiert ist, in der es nach marshalling? Ist es UTF-8?
  • Es ist kein charset definiert, im XML-header, nur <?xml version="1.0" ?>. Aber ich habe dieses: m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
InformationsquelleAutor oliverwood | 2011-04-28
Schreibe einen Kommentar