В синтаксическом анализаторе 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. Рекомендации
- Википедия – Объектная модель документа
- Объектная модель Oracle – Документа
- Как читать XML–файл на Java – (DOM-анализатор)
- Как написать XML–файл на Java – (DOM-анализатор)
- Как читать XML–файл на Java – (синтаксический анализатор SAX)
- Как читать XML–файл на Java – (синтаксический анализатор JDOM)
- Пример JAXB привет, мир
Оригинал: “https://mkyong.com/java/how-to-count-the-depth-of-xml-document-dom-example/”