2009-10-28 11 views
13

leyendo la documentación de java org.w3c.dom.ls parece que un elemento solo se puede serializar a una cadena con la codificación de cadena nativa java, UTF-16. Sin embargo, necesito crear una cadena UTF-8, escapada o no, entiendo que todavía será una cadena UTF-16. Alguien tiene una idea para evitar esto? Necesito la cadena para pasar a un cliente WS generado que consumirá la cadena, entonces debería ser UTF-8.DOMImplementationLS se serializa en String en UTF-8 en Java

el código que utilizo para crear la cadena:

DOMImplementationRegistry domImplementationRegistry = DOMImplementationRegistry. 
DOMImplementationLS domImplementationLS = (DOMImplementationLS) REGISTRY.getDOMImplementation("LS"); 
LSSerializer writer = domImplementationLS.createLSSerializer(); 
String result = writer.writeToString(element); 
+1

@Tomas - no hay tal cosa como un UTF-8 String de Java. Esperaría cualquier intento de forzar bytes codificados en UTF-8 en un tipo de char para terminar en lágrimas. – McDowell

Respuesta

7

me parece que la forma más flexible de la serialización de un DOM en cadena es utilizar el javax.xml.transform API:

Node node = ... 
    StringWriter output = new StringWriter(); 

    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.transform(new DOMSource(node), new StreamResult(output)); 

    String xml = output.toString(); 

No es especialmente elegante, pero debería darle un mejor control sobre la codificación de salida.

+0

funciona como un encanto, pero ¿cómo puedo establecer la codificación explícita, esto genera UTF-8 sin configuración? – Tomas

+0

Eso depende de la implementación de 'Writer' que use. 'StringWriter' simplemente pasa a ser UTF-8, creo. – skaffman

+1

@skaffman - "StringWriter resulta ser el UTF-8 por defecto". Estás equivocado. The String es UTF-16; el transformador podría agregar un encabezado XML que diga '', pero eso no tiene nada que ver con ninguna operación de codificación real. – McDowell

13

Puede seguir utilizando DOMImplementationLS:

DOMImplementationRegistry domImplementationRegistry = DOMImplementationRegistry. 
DOMImplementationLS domImplementationLS = (DOMImplementationLS)REGISTRY.getDOMImplementation("LS"); 
LSOutput lsOutput = domImplementationLS.createLSOutput(); 
lsOutput.setEncoding("UTF-8"); 
Writer stringWriter = new StringWriter(); 
lsOutput.setCharacterStream(stringWriter); 
lsSerializer.write(doc, lsOutput);  
String result = stringWriter.toString();