package de.mvitz.examples.xml.dom;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public final class Test {
public static void main(String[] args) throws Exception {
final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
final Document document = builder.parse(Test.class.getResourceAsStream("/test.xml"));
final Node root = document.getChildNodes().item(0);
System.out.println(traverse(root));
}
private static String traverse(Node node) {
return traverse(node, 0);
}
private static String traverse(Node node, int level) {
final StringBuilder result = new StringBuilder();
switch (node.getNodeType()) {
case Node.ELEMENT_NODE:
result.append(indent(level)).append(startTag(node));
result.append(traverseChildren(node, level));
result.append(indent(level)).append(endTag(node));
break;
case Node.TEXT_NODE:
result.append(text(node, level));
break;
default:
break;
}
return result.toString();
}
private static String indent(int level) {
final StringBuilder indent = new StringBuilder();
for (int i = 0; i < level; i++)
indent.append(" ");
return indent.toString();
}
private static String startTag(Node node) {
return "<" + node.getNodeName() + attributes(node) + ">\n";
}
private static String attributes(Node node) {
final StringBuilder result = new StringBuilder();
final NamedNodeMap attributes = node.getAttributes();
for (int i = 0; i < attributes.getLength(); i++) {
result.append(attribute(attributes.item(i)));
}
return result.toString();
}
private static String attribute(Node attribute) {
return " " + attribute.getNodeName() + "=\"" + attribute.getNodeValue() + "\"";
}
private static String traverseChildren(Node node, int level) {
final StringBuilder result = new StringBuilder();
final NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
result.append(traverse(children.item(i), level + 1));
}
return result.toString();
}
private static String endTag(Node node) {
return "</" + node.getNodeName() + ">\n";
}
private static String text(Node node, int level) {
if (!"".equals(node.getNodeValue().trim()))
return indent(level) + node.getNodeValue() + "\n";
return "";
}
}