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