2012-04-12 1 views
2

Haben Sie eine JavaRCP Anwendung, die JAXB verwendet, um eine XML-Datei zu generieren, nimmt es im Grunde auch Eingabe (Sonderzeichen) aus Textfeld in XML zu speichern und anzuzeigen aus XML entpacken.So schreiben und lesen Sie Sonderzeichen und Symbole aus XML mit JAXB

Der Benutzer kopiert die Konsolenausgabe (kann Sonderzeichen enthalten), fügt sie in das Textfeld ein und speichert sie in einem XML-Code.

 
xml version="1.0" encoding="UTF-8" 

jaxb version is 2.1.10 in JDK 1.6_21. 

Wenn unmarshalling, eine unmarshall Ausnahme empfangen:

[org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x1b) was found in the element content of the document]

Es ist ein ungültiges gefunden XML-Zeichen, wenn die XML-unmarshalling. Ich suchte in diesem Forum nach Hilfe und fand nur wenige Links, aber keiner von ihnen hat eine Lösung oder eine Problemumgehung. Kann mir jemand helfen?

Ich habe mit anderen Codierungstypen versucht, aber mit keinem Erfolg. Muss ich dieses Zeichen vor dem Speichern/Marshalling durch den entsprechenden Zeichencode ersetzen?

Im Folgenden sind die Links, die zu meinem Problem näher sind: Saving an escape character 0x1b in an XML file Invalid Characters in XML

Antwort

4

A JAXB bug report describing this problem wurde mit der folgenden Erklärung geschlossen:

Sorry, das ist einfach eine Einschränkung in XML.

In XML sind Steuerzeichen nicht zulässig. Siehe die Liste der erlaubten Zeichen bei http://www.w3.org/TR/REC-xml/#NT-Char

Dies ist keine Frage der Flucht http://www.w3.org/TR/REC-xml/#sec-references. Diese Zeichen wie \ u001C sind einfach kein gültiges Zeichen in XML. Es gibt keine Möglichkeit, Zeichenfolgen zu übertragen, die diese Zeichen enthalten.

Sie können entweder Ihr eigenes Zeichenfolgencodierungsschema erstellen, um Ihre Zeichenfolge "XML-sicher" zu machen, oder binäre Codierung wie base64 verwenden.

Also gibt es absolut keine Möglichkeit, diese Zeichen in XML darzustellen. Wenn die genaue Darstellung dieser Zeichenfolgen für Ihre Anwendung nicht kritisch ist, können Sie diese Zeichen einfach entfernen oder durch Platzhalter ersetzen. Andernfalls müssen Sie diese Zeichenfolgen mithilfe eines sicheren Codierungsschemas wie Base64 codieren.

+0

Das ist ärgerlich, und genau die Art von daftness, die mich manchmal mit Leidenschaft hassen XML macht, aber es ist in der Tat wahr. In der Anwendung, an der ich gerade arbeite, haben wir einen Bereinigungsschritt, der eine Vielzahl verdächtiger Zeichen durch Leerzeichen ersetzt, um dieses Problem zu vermeiden. –

+0

Danke für die Antwort, aber ich stolperte über diesen JAXB-Fehler, der noch offen ist: http://java.net/jira/browse/JAXB-614 Beschreibung des Fehlers erklärt alles. – user1328572

1

Wenn Sie CONTROL CHAR nicht entfernen möchten, können Sie das Zeichen umgehen.
Sie können java.net.URLEncoder verwenden, um Ihre Daten serverseitig zu codieren und sie dann mit java.net.URLDecoder auf der Clientseite zu decodieren.
Es funktioniert wie Charme, ich habe es für den gleichen Zweck verwendet und funktioniert gut.

Wenn Sie 0x1b durch  manuell im Code ersetzen, finden Sie an anderen Tagen einige andere CONTROL CHAR. Also ich denke besser Weg ist, Encoder/Decoder zu verwenden, wenn Sie Daten beibehalten möchten, ansonsten entfernt es.

Sie können meine Frage hier beziehen: Illegal character - CTRL-CHAR