Discuss / Java / 递归打印的部分

递归打印的部分

Topic source
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;
    }
}

  • 1

Reply