Рубрики
Без рубрики

Как подсчитать глубину XML-документа (анализатор DOM)

В синтаксическом анализаторе DOM мы можем использовать рекурсивный цикл дочерних узлов, чтобы найти или подсчитать глубину XML-документа.

В синтаксическом анализаторе DOM мы можем использовать рекурсивный цикл дочерних узлов, чтобы найти или подсчитать глубину XML-документа.

Содержание

  • 1. XML-файл
  • 2. Синтаксический анализатор DOM + Рекурсивный цикл
  • 3. Парсер DOM + Ходок по деревьям
  • 4. Скачать Исходный Код
  • 5. Рекомендации

P.S Протестирован с Java 11.

Примечание

  • Как читать XML–файл на Java – (DOM-анализатор)

1. XML-файл

Приведенный ниже XML-файл состоит из 3 уровней глубины.


                     
             
        mkyong   
        support  
        5000
        
        
    
    
        yflow
        admin
        8000
        
    

2. Синтаксический анализатор DOM + Рекурсивный цикл

В приведенном ниже примере используется анализатор DOM и рекурсивный цикл для определения глубины уровня XML.

package com.mkyong.xml.dom;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class CountDepthXmlDom {

  private static final String FILENAME = "src/main/resources/staff.xml";
  private static int DEPTH_XML = 0;

  public static void main(String[] args) {

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

      try (InputStream is = new FileInputStream(FILENAME)) {

          DocumentBuilder db = dbf.newDocumentBuilder();

          Document doc = db.parse(is);

          // get all elements
          NodeList childNodes = doc.getChildNodes();

          printNode(childNodes, 0);

          System.out.println("Depth of XML : " + DEPTH_XML);

      } catch (ParserConfigurationException | SAXException | IOException e) {
          e.printStackTrace();
      }

  }

  // loop recursive
  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) {

                  String result = String.format(
                          "%" + level * 5 + "s : [%s]%n", node.getNodeName(), level);
                  System.out.print(result);

                  printNode(node.getChildNodes(), level);

                  // how depth is it?
                  if (level > DEPTH_XML) {
                      DEPTH_XML = level;
                  }

              }

          }
      }

  }

}

Выход

company : [1]
   staff : [2]
         name : [3]
         role : [3]
       salary : [3]
          bio : [3]
   staff : [2]
         name : [3]
         role : [3]
       salary : [3]
          bio : [3]
Depth of XML : 3

3. Парсер DOM + Ходок по деревьям

В приведенном ниже примере используется Dom TreeWalker для обхода узлов и определения глубины уровня XML.

package com.mkyong.xml.dom;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.TreeWalker;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class CountDepthXmlDomTreeWalker {

    private static final String FILENAME = "src/main/resources/staff.xml";
    private static int DEPTH_XML = 0;

    public static void main(String[] args) {

        int depth = countDepthXml(FILENAME);
        System.out.println("Depth of XML : " + depth);
    }

    private static int countDepthXml(String filename) {

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        try (InputStream is = new FileInputStream(filename)) {

            DocumentBuilder db = dbf.newDocumentBuilder();

            Document doc = db.parse(is);

            DocumentTraversal traversal = (DocumentTraversal) doc;

            // DOM tree walker
            TreeWalker walker = traversal.createTreeWalker(
                    doc.getDocumentElement(),
                    NodeFilter.SHOW_ELEMENT,
                    null,
                    true);

            traverseXmlElements(walker, 0);

        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }

        return DEPTH_XML;

    }

    private static void traverseXmlElements(TreeWalker walker, int level) {

        level++;

        Node node = walker.getCurrentNode();

        String result = String.format(
                "%" + level * 5 + "s : [%s]%n", node.getNodeName(), level);
        System.out.print(result);

        for (Node n = walker.firstChild();
             n != null;
             n = walker.nextSibling()) {
            traverseXmlElements(walker, level);
        }

        walker.setCurrentNode(node);

        // how depth is it?
        if (level > DEPTH_XML) {
            DEPTH_XML = level;
        }

    }

}

Выход

company : [1]
   staff : [2]
         name : [3]
         role : [3]
       salary : [3]
          bio : [3]
   staff : [2]
         name : [3]
         role : [3]
       salary : [3]
          bio : [3]
Depth of XML : 3

4. Скачать Исходный Код

$клон git $клон git

$компакт-диск java-xml

$cd src/основной/java/com/mkyong/xml/дом/

5. Рекомендации

Оригинал: “https://mkyong.com/java/how-to-count-the-depth-of-xml-document-dom-example/”