xmlドキュメントの深さを数える方法(DOMの例)
XMLの深さを取得するには、ノードを再帰的にループし、そのレベルを比較するだけです。これは、XMLファイルの最も深いレベルを数えて表示するDOMパーサの例です。
1. XMLファイル
/users/mkyong/test.xml
<company>
<staff id="1">
<firstname>yong</firstname>
<lastname>mook kim</lastname>
<nickname>mkyong</nickname>
<salary>1000000</salary>
<age>29</age>
<extra>
<test>123</test>
</extra>
</staff>
<staff id="2">
<firstname>low</firstname>
<lastname>yin fong</lastname>
<nickname>fong fong</nickname>
<salary>500000</salary>
</staff>
</company>
2. Java
XMLUtil.java
package com.mkyong;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XMLUtil {
static int depthOfXML = 1;
public static void main(String argv[]) {
try {
String filepath = "/users/mkyong/test.xml";
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(filepath);
Element elements = doc.getDocumentElement();
int level = 1;
System.out.println(elements.getNodeName() + "[" + level + "]");
NodeList nodeList = elements.getChildNodes();
printNode(nodeList, level);
System.out.println("The deepest level is : " + depthOfXML);
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (SAXException sae) {
sae.printStackTrace();
}
}
private static void printNode(NodeList nodeList, int level) {
level++;
if (nodeList != null && nodeList.getLength() > 0) {
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT__NODE) {
System.out.println(node.getNodeName() + "[" + level + "]");
printNode(node.getChildNodes(), level);
//how depth is it?
if (level > depthOfXML) {
depthOfXML = level;
}
}
}
}
}
}
出力
company[1]staff[2]firstname[3]lastname[3]nickname[3]salary[3]age[3]extra[3]test[4]staff[2]firstname[3]lastname[3]nickname[3]salary[3]The deepest level is : 4