import java.io.FileInputStream;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
public class Main {
public static void main(String[] args) throws Exception{
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder documentBuilder = docBuilderFactory
.newDocumentBuilder();
Document node = documentBuilder.parse(new FileInputStream("data.xml"));
cleanEmptyTextNodes(node);
StreamResult result = new StreamResult(new StringWriter());
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount",
Integer.toString(4));
transformer.transform(new DOMSource(node), result);
System.out.println(result.getWriter().toString());
}
private static void cleanEmptyTextNodes(Node parentNode) {
boolean removeEmptyTextNodes = false;
Node childNode = parentNode.getFirstChild();
while (childNode != null) {
removeEmptyTextNodes |= checkNodeTypes(childNode);
childNode = childNode.getNextSibling();
}
if (removeEmptyTextNodes) {
removeEmptyTextNodes(parentNode);
}
}
private static void removeEmptyTextNodes(Node parentNode) {
Node childNode = parentNode.getFirstChild();
while (childNode != null) {
Node nextChild = childNode.getNextSibling();
short nodeType = childNode.getNodeType();
if (nodeType == Node.TEXT_NODE) {
boolean containsOnlyWhitespace = childNode.getNodeValue()
.trim().isEmpty();
if (containsOnlyWhitespace) {
parentNode.removeChild(childNode);
}
}
childNode = nextChild;
}
}
private static boolean checkNodeTypes(Node childNode) {
short nodeType = childNode.getNodeType();
if (nodeType == Node.ELEMENT_NODE) {
cleanEmptyTextNodes(childNode); // recurse into subtree
}
if (nodeType == Node.ELEMENT_NODE
|| nodeType == Node.CDATA_SECTION_NODE
|| nodeType == Node.COMMENT_NODE) {
return true;
} else {
return false;
}
}
}