我正在尝试使用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>
当我在该程序上运行方法时,输出显示首先执行了第二个嵌套的容器节点,并且打印了其中的所有叶子。而我想从第一个容器中打印所有内容,然后从第二个容器中打印出来。
我希望这有意义吗?附言:对格式感到抱歉,我无法弄清楚。 谢谢
答案 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);
}
}
}
这将在其子节点之前打印父节点,而不是相反。