Ungültiger XML-Zeichen während Unmarshall

9

Ich sortiere Objekte zu XML-Dateien mit der Codierung "UTF-8". Es erzeugt Datei erfolgreich. Aber wenn ich versuche, es zurückzumelden, gibt es einen Fehler:

  

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

Das Zeichen ist 0x1A oder \ u001a, das in UTF-8 gültig, in XML jedoch unzulässig ist. Marshaller in JAXB ermöglicht das Schreiben dieses Zeichens in eine XML-Datei, aber Unmarshaller kann das Zeichen nicht zurück analysieren. Ich habe versucht, eine andere Codierung (UTF-16, ASCII, etc), aber immer noch Fehler.

Die gängige Lösung besteht darin, dieses ungültige Zeichen vor dem XML-Parsing zu entfernen / zu ersetzen. Aber wenn wir dieses Zeichen zurück brauchen, wie erhält man das ursprüngliche Zeichen nach dem Unmarshalling?

Bei der Suche nach dieser Lösung möchte ich die ungültigen Zeichen durch ein Ersatzzeichen ersetzen (z. B. dot="."), bevor die Neuprogrammierung durchgeführt wird.

Ich habe diese Klasse erstellt:

%Vor%

Dann lese und entpacke ich die Datei:

%Vor%

Irgendwie ersetzt der Leser ungültige Zeichen nicht durch das gewünschte Zeichen. Es ergeben sich falsche XML-Daten, die nicht entpackt werden können. Stimmt etwas nicht mit meiner InvalidXMLCharacterFilterReader-Klasse?

    
oliverwood 28.04.2011, 07:24
quelle

2 Antworten

2

Das Unicode-Zeichen U + 001A ist in XML 1.0 illegal :

Die Codierung, die verwendet wird, um es darzustellen, spielt in diesem Fall keine Rolle, es ist in XML-Inhalten einfach nicht erlaubt.

XML 1.1 ermöglicht die Aufnahme einiger der eingeschränkten Zeichen (einschließlich U + 001A), aber diese muss als numerische Zeichenreferenzen (  ) vorhanden sein

Wikipedia hat eine schöne Zusammenfassung der Situation .

    
Joachim Sauer 28.04.2011 07:55
quelle
1

Ich denke, dass das Hauptproblem darin besteht, während des Marshalling-Vorgangs unzulässige Zeichen zu umgehen . Etwas ähnliches wurde hier erwähnt, du könntest es ausprobieren.

Es bietet an, die Kodierung in Unicode marshaller.setProperty("jaxb.encoding", "Unicode");

zu ändern     
JMelnik 28.04.2011 07:41
quelle