Java tutorial
//package com.java2s; /******************************************************************************* * Copyright (c) 2009, 2013 Andrew Gvozdev (Quoin Inc.). * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Andrew Gvozdev (Quoin Inc.) *******************************************************************************/ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class Main { private static final String EOL_XML = "\n"; private static final String DEFAULT_IDENT = "\t"; /** * As a workaround for {@code javax.xml.transform.Transformer} not being able * to pretty print XML. This method prepares DOM {@code Document} for the transformer * to be pretty printed, i.e. providing proper indentations for enclosed tags. * * @param doc - DOM document to be pretty printed */ public static void prettyFormat(Document doc) { prettyFormat(doc, DEFAULT_IDENT); } /** * As a workaround for {@code javax.xml.transform.Transformer} not being able * to pretty print XML. This method prepares DOM {@code Document} for the transformer * to be pretty printed, i.e. providing proper indentations for enclosed tags. * * @param doc - DOM document to be pretty printed * @param ident - custom indentation as a string of white spaces */ public static void prettyFormat(Document doc, String ident) { doc.normalize(); Element documentElement = doc.getDocumentElement(); if (documentElement != null) { prettyFormat(documentElement, "", ident); //$NON-NLS-1$ } } /** * The method inserts end-of-line+indentation Text nodes where indentation is necessary. * * @param node - node to be pretty formatted * @param identLevel - initial indentation level of the node * @param ident - additional indentation inside the node */ private static void prettyFormat(Node node, String identLevel, String ident) { NodeList nodelist = node.getChildNodes(); int iStart = 0; Node item = nodelist.item(0); if (item != null) { short type = item.getNodeType(); if (type == Node.ELEMENT_NODE || type == Node.COMMENT_NODE) { Node newChild = node.getOwnerDocument().createTextNode(EOL_XML + identLevel + ident); node.insertBefore(newChild, item); iStart = 1; } } for (int i = iStart; i < nodelist.getLength(); i++) { item = nodelist.item(i); if (item != null) { short type = item.getNodeType(); if (type == Node.TEXT_NODE && item.getNodeValue().trim().length() == 0) { if (i + 1 < nodelist.getLength()) { item.setNodeValue(EOL_XML + identLevel + ident); } else { item.setNodeValue(EOL_XML + identLevel); } } else if (type == Node.ELEMENT_NODE) { prettyFormat(item, identLevel + ident, ident); if (i + 1 < nodelist.getLength()) { Node nextItem = nodelist.item(i + 1); if (nextItem != null) { short nextType = nextItem.getNodeType(); if (nextType == Node.ELEMENT_NODE || nextType == Node.COMMENT_NODE) { Node newChild = node.getOwnerDocument() .createTextNode(EOL_XML + identLevel + ident); node.insertBefore(newChild, nextItem); i++; continue; } } } else { Node newChild = node.getOwnerDocument().createTextNode(EOL_XML + identLevel); node.appendChild(newChild); i++; continue; } } } } } }