如何更改Java中执行递归函数的顺序?

时间:2018-08-07 16:14:45

标签: java xml dom

我正在尝试使用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>

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

我希望这有意义吗?附言:对格式感到抱歉,我无法弄清楚。 谢谢

1 个答案:

答案 0 :(得分:0)

交换代码,以便首先处理当前节点,然后遍历该节点:

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);
        }
    }
}

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