Java HTML / XML How to - Pretty print XML








Question

We would like to know how to pretty print XML.

Answer

import java.io.StringReader;
//from  w  w  w  . j a  va2s  .  c  om
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Node;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;
import org.xml.sax.InputSource;

public class Main {

  public static String format(String xml) throws Exception {
    InputSource src = new InputSource(new StringReader(xml));
    Node document = DocumentBuilderFactory.newInstance().newDocumentBuilder()
        .parse(src).getDocumentElement();
    Boolean keepDeclaration = Boolean.valueOf(xml.startsWith("<?xml"));

    System.setProperty(DOMImplementationRegistry.PROPERTY,
        "com.sun.org.apache.xerces.internal.dom.DOMImplementationSourceImpl");

    DOMImplementationRegistry registry = DOMImplementationRegistry
        .newInstance();
    DOMImplementationLS impl = (DOMImplementationLS) registry
        .getDOMImplementation("LS");
    LSSerializer writer = impl.createLSSerializer();

    writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
    writer.getDomConfig().setParameter("xml-declaration", keepDeclaration);
    return writer.writeToString(document);
  }

  public static void main(String[] args) throws Exception {
    String unformattedXml = "<?xml version='1.0' encoding='UTF-8'?><QueryMessage\n"
        + "        xmlns='http://www.SDMX.org/'\n"
        + "        xmlns:query='http://www.SDMX.org/query'>\n"
        + "    <Query>\n"
        + "        <query:CategorySchemeWhere>\n"
        + "           <query:AgencyID>ECB\n\n\n\n</query:AgencyID>\n"
        + "        </query:CategorySchemeWhere>\n"
        + "    </Query>\n\n\n\n\n"
        + "</QueryMessage>";

    System.out.println(format(unformattedXml));
  }
}