import java.io.File;
import java.util.LinkedList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Main {
public static void main(String[] args) throws Exception {
DocumentBuilder builder = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document doc = builder.parse(new File("test1.xml"));
removeEmptyChildElements(doc.getDocumentElement());
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("clean.xml"));
transformer.transform(source, result);
}
private static void removeEmptyChildElements(Element parentElement) {
List toRemove = new LinkedList();
NodeList children = parentElement.getChildNodes();
int childrenCount = children.getLength();
for (int i = 0; i < childrenCount; ++i) {
Node child = children.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE) {
Element childElement = (Element) child;
removeEmptyChildElements(childElement);
if (elementIsRedundant(childElement)) {
toRemove.add(childElement);
}
}
}
for (Element childElement : toRemove) {
parentElement.removeChild(childElement);
}
parentElement.normalize();
}
private static boolean elementIsRedundant(Element element) {
if (element.hasAttributes())
return false;
if (!element.hasChildNodes())
return true;
NodeList children = element.getChildNodes();
int childrenCount = children.getLength();
for (int i = 0; i < childrenCount; ++i) {
Node child = children.item(i);
String value = child.getNodeValue();
if (value != null && !value.matches("\\s*")) {
return false; // Found non-whitespace text
}
}
return true;
}
}