首页 > 解决方案 > 如何更改在 Java 中执行递归函数的顺序?

问题描述

我正在尝试使用 JAVA DOM 解析器对 XML 文档中的许多标签进行索引,以从中形成类似 MIB 的结构(例如

<module>
    <container>
        <list>
            <leaf></leaf>
            <leaf></leaf>
... 

我希望将模块映射到 1,将容器映射到 1.1,将列表映射到 1.1.1,将叶子映射到 1.1.1.1,将另一个叶子映射到 1.1.1.2(我已经有这样做的方法)但是当同名时我遇到了问题XML 标记是嵌套的。这是我创建的函数 - 为简单起见仅打印出属性名称

public static void traverse(Node node) {
    NodeList nodeList = node.getChildNodes();
    for (int i = 0; i < nodeList.getLength(); i++) {
        // gets the current node
        Node currentNode = nodeList.item(i);

        if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
            traverse(currentNode);
        }

        if (currentNode.getNodeName().equals("container")) {
            for (int j = 0; j < currentNode.getChildNodes().getLength(); j++) {
                if (currentNode.getChildNodes().item(j).getNodeType() == Node.ELEMENT_NODE) {
                    Element e = (Element) currentNode.getChildNodes().item(j);
                    System.out.println(e.getAttribute("name") + " "
                            + currentNode.getChildNodes().item(j).getNodeName());
                }
            }
        }
    }
}

这是我要解析的 XML 示例:

<container name="alarm">
    <list name="config">
        <leaf name="source">
            <type name="larmSourceType" />
            <description>
                <text>The name</text>
            </description>
            <mandatory value="true" />
        </leaf>
        <leaf name="name">
            <type name="atNameType" />
            <description>
                <text>fies each alarm within the named alarm source</text>
    </list>
    <container name="stat">
        <leaf name="currentActiveAlarms">
            <type name="atc:alarmCounterType" />
        </leaf>
    </container>
</container>

当我在这个程序上运行我的方法时,输出显示第二个嵌套容器节点首先执行,并且该节点中的所有叶子都被打印出来。而我想从第一个容器中打印所有内容,然后是第二个。

我希望这是有道理的?PS对不起格式,我无法弄清楚。谢谢

标签: javaxmldom

解决方案


交换您的代码,以便您首先对当前节点执行操作,然后再遍历:

public static void traverse(Node node) {
    NodeList nodeList = node.getChildNodes();
    for (int i = 0; i < nodeList.getLength(); i++) {
        // gets the current node
        Node currentNode = nodeList.item(i);

        // Do stuff with current node first
        if (currentNode.getNodeName().equals("container")) {
            for (int j = 0; j < currentNode.getChildNodes().getLength(); j++) {
                if (currentNode.getChildNodes().item(j).getNodeType() == Node.ELEMENT_NODE) {
                    Element e = (Element) currentNode.getChildNodes().item(j);
                    System.out.println(e.getAttribute("name") + " "
                            + currentNode.getChildNodes().item(j).getNodeName());
                }
            }
        }

        // traverse deeper after having done stuff with current node (above)
        if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
            traverse(currentNode);
        }
    }
}

这将在其子节点之前打印父节点,而不是相反。


推荐阅读