2010-08-26 26 views
5

Estoy intentando guardar un árbol (extiende JTree) que contiene un documento XML a un DOM Object habiendo cambiado su estructura.Java, XML DocumentBuilder: configuración de la codificación al analizar

He creado un nuevo objeto de documento, atravesado el árbol para recuperar el contenido con éxito (incluyendo la codificación original del documento XML), y ahora tienen una ByteArrayInputStream que tiene el contenido de los árboles (XML documento) con la codificación correcta.

El problema es que cuando analizo ByteArrayInputStream la codificación cambia a UTF-8 (en el documento XML) automáticamente.

Hay una manera de evitar esto y utilizar la codificación correcta como se proporciona en el ByteArrayInputStream.

También vale la pena agregar que ya he usado el método
transformer.setOutputProperty(OutputKeys.ENCODING, encoding) para recuperar la codificación correcta.

Cualquier ayuda sería apreciada.

+0

¿Puede compartir un poco de su código? – gawi

Respuesta

2

Lo resolví, dado un montón de pruebas y errores.

que estaba usando

OutputFormat format = new OutputFormat(document); 

pero lo cambió a

OutputFormat format = new OutputFormat(d, encoding, true); 

y esto resuelto mi problema.

encoding es lo que se propuso que fuera
true guión se refiere a si o no está establecido.

Nota para leer con más cuidado - Miré el javadoc hace horas - si tan solo hubiera leído con más cuidado.

3
// Read XML 
String xml = "xml" 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document document = builder.parse(new InputSource(new StringReader(xml))); 

// Append formatting 
OutputFormat format = new OutputFormat(document); 

if (document.getXmlEncoding() != null) { 
    format.setEncoding(document.getXmlEncoding()); 
} 

format.setLineWidth(100); 
format.setIndenting(true); 
format.setIndent(5); 
Writer out = new StringWriter(); 
XMLSerializer serializer = new XMLSerializer(out, format); 
serializer.serialize(document); 
String result = out.toString(); 
+11

Alguna explicación de este código sería útil para aquellos que vengan y lean esta respuesta más adelante. –

3

Aquí es una respuesta actualizada desde OutputFormat está en desuso:

TransformerFactory tf = TransformerFactory.newInstance(); 
Transformer transformer = tf.newTransformer(); 
transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); 

StringWriter writer = new StringWriter(); 
transformer.transform(new DOMSource(document), new StreamResult(writer)); 
String output = writer.getBuffer().toString().replaceAll("\n|\r", ""); 

La segunda parte devolverá el documento XML como cuerdas

0

Esto funcionó para mí y es muy simple. No es necesario un transformador o formateador de salida:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
InputSource is = new InputSource(inputStream); 
is.setEncoding("ISO-8859-1"); // set your encoding here 
Document document = builder.parse(is); 
Cuestiones relacionadas