2009-10-28 8 views
13

Lesen der Dokumentation für java org.w3c.dom.ls Es scheint, als ob ein Element nur zu einem String mit der Java-Native-String-Codierung UTF-16 serialisiert werden kann. Ich muss jedoch eine UTF-8-Zeichenfolge erstellen, maskiert oder was nicht, ich verstehe, dass es immer noch eine UTF-16 String sein wird. Hat jemand eine Idee, um das zu umgehen? Ich brauche die Zeichenfolge, die an einen generierten WS-Client übergeben wird, der die Zeichenfolge konsumiert, dann sollte es UTF-8 sein.DOMImplementationLS Serialisierung zu String in UTF-8 in Java

der Code i die Zeichenfolge erstellen können:

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

@Tomas - es gibt nicht so etwas wie eine UTF-8 Java String. Ich würde jeden Versuch erwarten, UTF-8-kodierte Bytes in einen char-Typ zu zwingen, um in Tränen zu enden. – McDowell

Antwort

7

Ich finde, dass die flexibelste Weg, um ein DOM zu String von Serialisierung der javax.xml.transform API zu verwenden ist:

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

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

    String xml = output.toString(); 

Es ist nicht besonders elegant, aber es sollte Ihnen eine bessere Kontrolle über die Ausgabecodierung geben.

+0

funktioniert als ein Charme, aber wie setze ich die Codierung explizit, erzeugt dies UTF-8 ohne Konfiguration? – Tomas

+0

Das ist die "Writer" Implementierung, die Sie verwenden. "StringWriter" ist zufällig auf UTF-8 voreingestellt, denke ich. – skaffman

+1

@skaffman - "StringWriter ist zufällig auf UTF-8 voreingestellt". Du liegst falsch. Die Zeichenfolge ist UTF-16; Der Transformer könnte einen XML-Header hinzufügen, der sagt '', aber das hat nichts mit irgendwelchen tatsächlichen Kodierungsoperationen zu tun. – McDowell

13

Sie können immer noch DOMImplementationLS verwenden:

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();