在Java中使用DocumentTraversal递归遍历XML元素
我一直在使用以下代码结构遍历XML文档,它运行得非常好:在Java中使用DocumentTraversal递归遍历XML元素,java,xml,Java,Xml,我一直在使用以下代码结构遍历XML文档,它运行得非常好: import org.w3c.dom.traversal.*; ... private static SomeReturnType traverse(Document doc) { DocumentTraversal dt = (DocumentTraversal) doc; // line-a NodeIterator i = dt.createNodeIterator(doc, NodeFilter.SHOW_ELE
import org.w3c.dom.traversal.*;
...
private static SomeReturnType traverse(Document doc) {
DocumentTraversal dt = (DocumentTraversal) doc; // line-a
NodeIterator i = dt.createNodeIterator(doc, NodeFilter.SHOW_ELEMENT, null, false);
Node node = i.nextNode();
while (node != null) {
// do stuff
node = i.nextNode();
}
return ...
}
但是,如何能够概括上述内容以允许在文档的随机XML元素中进行遍历,而不仅仅是整个文档?从理论上讲,这应该很容易,因为在XML中,文档可以简单地看作是最外层的元素,但API是违反直觉的
换言之,您将如何编写上述函数以将元素
或节点
作为参数
更新
解决办法似乎是:
private static SomeReturnType traverse(Node rootNode) {
DocumentTraversal dt = (DocumentTraversal) rootNode.getOwnerDocument();
NodeIterator i = dt.createNodeIterator(rootNode, NodeFilter.SHOW_ELEMENT, null, false);
Node node = i.nextNode();
while (node != null) {
// do stuff
node = i.nextNode();
}
return ...
}
让您的方法使用
节点
而不是文档
。请注意,DocumentTraversal
使用节点
,因此,我实现了一个迭代器
/Iterable
包装器,它围绕节点列表
。它只是使用NodeList.getLength()
来确定元素的数量。因此,我要做的是将一个节点
传递给该方法,并使用Node.getChildNodes()
。您可以直接使用节点列表
,也可以将其包装在迭代器中
首先,传递的文档
实现文档遍历
,这不是一个危险的假设吗?javadoc在支持遍历功能的DOMs中声明,DocumentTraversal将由实现文档接口的相同对象来实现。
因此我认为您不可能总是做出这种假设。在这种方法中,您不会获得不是任何节点的子节点的属性,而文档遍历也可以通过SHOW\u ALL过滤器来通用化,以返回属性。还是我遗漏了什么?无论如何,我现在有了一个实现,这要感谢你之前的答案,你删除了它,所以我不能接受。我取消了它,只是为了以防万一,但将节点
转换为文档遍历
似乎是一个错误的假设。