Ich verwende JAXP, um ein XML-Dokument zu generieren und zu analysieren, von dem einige Felder aus einer Datenbank geladen werden.Erstellen von gültigem XML mit Java und UTF-8 Codierung
-Code die XML-Serialisierung:
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.newDocument();
Element root = doc.createElement("test");
root.setAttribute("version", text);
doc.appendChild(root);
DOMSource domSource = new DOMSource(doc);
TransformerFactory tFactory = TransformerFactory.newInstance();
FileWriter out = new FileWriter("test.xml");
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(domSource, new StreamResult(out));
Code, um das XML zu analysieren:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("test.xml");
Und ich stoßen die folgende Ausnahme:
[Fatal Error] test.xml:1:4: Invalid byte 1 of 1-byte UTF-8 sequence.
Exception in thread "main" org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at com.test.Test.xml(Test.java:27)
at com.test.Test.main(Test.java:55)
Der Text String enthält u- Umlaut und O-Umlaut (Zeichencodes 0xFC und 0xF6). Dies sind die Zeichen, die den Fehler verursachen. Wenn ich die Schnur selbst entziehe, um & #xFC zu verwenden; und & # xF6; dann geht das Problem weg. Andere Entitäten werden automatisch codiert, wenn ich das XML ausschreibe.
Wie erhalte ich meine Ausgabe ohne Einsetzen dieser Zeichen selbst richtig geschrieben/gelesen werden?
(ich folgende Fragen habe bereits gelesen:
How to encode characters from Oracle to XML?
Repairing wrong encoding in XML files)
Schön und einfach, ich habe daran gedacht, dies zu ändern, aber die Idee verworfen, da ich keine Möglichkeit sah, die Codierung im Konstruktor anzugeben. Es hat gut funktioniert, danke. –
Ich habe mich einmal mit FileWriter in den Fuß geschossen .... +1 –
Ausgezeichnete Antwort - Ich werde von nun an immer nach versteckten Gotchas in FileWriter suchen! –