如果有一个名为 a.xml 的XML文件,有没有办法在其中遍历其DOM树 后序时装?
我尝试使用 GetNextSiblings 方法,但它不起作用。有什么想法吗?
这是XML:
<?xml version="1.0" encoding="UTF-8"?>
<title text="title1">
<comment id="comment1">
<data> abcd </data>
<data> efgh </data>
</comment>
<comment id="comment2">
<data> ijkl </data>
<data> mnop </data>
<data> qrst </data>
</comment>
</title>
这是我的代码来遍历它:
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.*;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.NodeIterator;
import org.xml.sax.SAXException;
public class Newtraverse {
public static Node check(Node node){
Node c=node;
// Node c = null;
if (node!=null)
if (node.hasChildNodes()==true &&node.getNodeName()!=null)
{
node=node.getFirstChild().getNextSibling();
if (node!=null)
{
System.out.println(node);
check(node);
}
if(node==null)
{
c=c.getNextSibling();
check(c);
}
}
return node;
}
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
File file = new File("d:\\a.xml");
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(file);
document.getDocumentElement().normalize();
Node b=document.getFirstChild();
Node result= check(b);
}
}
这是输出:
[comment: null]
[data: null]
正如大家所见,它只是遍历两个标签。我该如何解决这个问题?
答案 0 :(得分:0)
您的check
函数执行此操作:
所以,首先检查title
,
title
的第二个孩子是具有三个comment
子元素的data
元素。
comment
节点。data
元素。
data
节点。null
)您可以通过不每次都跳过第一个子节点来解决此问题。您可能还希望遍历子节点,每次递归下一级别,而不是使用递归来处理所有内容。
答案 1 :(得分:0)
这是你的检查方法应该如何(虽然我没有运行它......)
public static void check(Node node){
if (node == null || node.getNodeName() == null)
return;
// Do PostOrder on all children
check(node.getFirstChild());
// Now that all children were traversed, process the current node:
System.out.println(node);
// Do PostOrder on following siblings
check(node.getNextSibling();
}