Estoy utilizando JAXP para generar y analizar un documento XML desde el que se cargan algunos campos desde una base de datos.Producción de XML válido con codificación Java y UTF-8
Código para serializar el XML:
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));
código para analizar el código XML:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("test.xml");
Y me encuentro con la siguiente excepción:
[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)
El texto cadena incluye u- umlaut y o-umlaut (códigos de caracteres 0xFC y 0xF6). Estos son los personajes que están causando el error. Cuando escapo de String para usar & #xFC; y & # xF6; entonces el problema desaparece Otras entidades se codifican automáticamente cuando escribo el XML.
¿Cómo consigo que mi salida se escriba/lea correctamente sin sustituir estos caracteres por mí mismo?
(He leído las siguientes preguntas ya:
How to encode characters from Oracle to XML?
Repairing wrong encoding in XML files)
Agradable y fácil, pensé en cambiar a esto pero descarté la idea ya que no vi una forma de especificar la codificación en el constructor. Funcionó bien, gracias. –
Me pegué un tiro en el pie con FileWriter una vez ... +1 –
Excelente respuesta: ¡de ahora en adelante buscaré Gotchas escondidas en FileWriter! –