Assumed, we got a fully parsed org.w3c.dom.Document:
Document doc; //parse doc etc...
Just using LSSerializer‘s writeToString method without specifying any encoding will result in (rather impractical) UTF-16 encoded xml file per default
DOMImplementation impl = doc.getImplementation(); DOMImplementationLS implLS = (DOMImplementationLS) impl.getFeature("LS", "3.0"); LSSerializer lsSerializer = implLS.createLSSerializer(); lsSerializer.getDomConfig().setParameter("format-pretty-print", true); String result = ser.writeToString(doc);
will output
<?xml version="1.0" encoding="UTF-16"?> ...
Unfortunately, specifying an encoding isn’t trivial. Here are two solutions that don’t require any third party libraries:
1. Using org.w3c.dom.ls.LSOutput
DOMImplementation impl = doc.getImplementation(); DOMImplementationLS implLS = (DOMImplementationLS) impl.getFeature("LS", "3.0"); LSSerializer lsSerializer = implLS.createLSSerializer(); lsSerializer.getDomConfig().setParameter("format-pretty-print", true); LSOutput lsOutput = implLS.createLSOutput(); lsOutput.setEncoding("UTF-8"); Writer stringWriter = new StringWriter(); lsOutput.setCharacterStream(stringWriter); lsSerializer.write(doc, lsOutput); String result = stringWriter.toString();
2. Using javax.xml.transform.Transformer
Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); DOMSource source = new DOMSource(doc); Writer stringWriter = new StringWriter(); StreamResult streamResult = new StreamResult(stringWriter); transformer.transform(source, streamResult); String result = stringWriter.toString();
Useful info, thanks for sharing!
@Torsten You’re most welcome! Thanks for stopping by.
Thank you it’s a veery useful post ! it helped me a lot.
however i have this problem trying both solutions, the result is not well formatted, in other word how to add a new line or force it to insert new line after each ‘>’.
for example : the current result for both solutions is :
the desired solution is :
the desired solution is :
Thanks!
Thanks a lot
Pingback: Trabajando con XML: Java XML API para la creación de ficheros y Simple framework para mensajes SOAP | Sobre IT y más