public class DomUtil { private static final HashMap<Integer, String> RETRACTION_MAP = new HashMap<>(8); /** * <b>DOM 递归打印节点信息</b> */ public static void recursionPrintNode(Node node, int retractLevel) { // 获取缩进 String prefer = getRetraction(retractLevel); switch (node.getNodeType()) { // 文档节点 case Node.DOCUMENT_NODE -> System.out.println(prefer + "Document: " + node.getNodeName()); // 元素节点 case Node.ELEMENT_NODE -> System.out.println(prefer + "Element: " + node.getNodeName()); // 文本节点 case Node.TEXT_NODE -> { String nodeText = node.getNodeValue().trim(); if (!"".equals(nodeText)) { System.out.println(prefer + "Text: " + nodeText); } } // 属性节点 case Node.ATTRIBUTE_NODE -> System.out.println(prefer + "Attr: " + node.getNodeName() + " = " + node.getNodeValue().trim()); // 非解析文本 case Node.CDATA_SECTION_NODE -> System.out.println(prefer + "CDATA: " + node.getNodeValue().trim()); // 注释 case Node.COMMENT_NODE -> System.out.println(prefer + "Comment: " + node.getNodeValue().trim()); // 其他情况 default -> System.out.println(prefer + "NodeType: " + node.getNodeType() + ", NodeName: " + node.getNodeName()); } // 打印属性 if (node.hasAttributes()) { // 获取标签内所有属性 NamedNodeMap attributes = node.getAttributes(); for (int foo = 0; foo < attributes.getLength(); foo++) { Node attrNode = attributes.item(foo); // 递归打印属性信息 recursionPrintNode(attrNode, (retractLevel + 1)); } } for (Node subNode = node.getFirstChild(); subNode != null; subNode = subNode.getNextSibling()) { // 递归打印子标签信息 recursionPrintNode(subNode, (retractLevel + 1)); } } /** * 获取缩进 */ private static String getRetraction(int retractLevel) { String retraction = RETRACTION_MAP.get(retractLevel); if (retraction == null) { char[] tempArr = new char[retractLevel]; // 用缩进符填充 Arrays.fill(tempArr, '\t'); retraction = new String(tempArr); RETRACTION_MAP.put(retractLevel, retraction); } return retraction; } }
Sign in to make a reply
忒修斯之船