Comment compter la profondeur du document XML (exemple DOM)

Comment compter la profondeur d'un document xml (exemple DOM)

Note
Cette question vient du forum JNP, demandant commentcalculate the depth of the entire XML document.

Pour obtenir la profondeur d'un XML, bouclez le nœud récursivement et comparez le niveau, c'est tout. Voici un exemple d'analyseur DOM pour compter et afficher le niveau le plus profond d'un fichier XML.

1. Fichier XML

/users/example/test.xml


        
                yong
                mook kim
                example
                1000000
                29
        
            123
        
        
        
                low
                yin fong
                fong fong
                500000
        

2. Exemple Java et DOM

XMLUtil.java

package com.example;

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/example/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;
            }

         }

        }

      }

  }

}

Sortie

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