java - 如何更改在 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对不起格式,我无法弄清楚。谢谢
解决方案
交换您的代码,以便您首先对当前节点执行操作,然后再遍历:
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);
}
}
}
这将在其子节点之前打印父节点,而不是相反。
推荐阅读
- django - 无法填充 django3 数据库
- php - 更改“返回商店”以返回上一页
- python - Quantopian 实时算法 - 如何?
- c - 用于删除 xx:xx:xx:xx:xx:xx 的 C 字符串操作
- python - Pandas 多索引 DataFrame 到 JSON
- javascript - D3.js 缩放:热图的离散比例不更新
- c# - 从 Bootstrap 模式弹出窗口提交数据
- ruby-on-rails - 尝试从 API 获取 JSON 数据时出现 No such file or directory 错误?
- javascript - 如何翻转 div 的内容?(底部的元素变成顶部的元素)
- r - 如何根据特定条件删除 R 中的行