在Java中使用DocumentTraversal递归遍历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

我一直在使用以下代码结构遍历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_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过滤器来通用化,以返回属性。还是我遗漏了什么?无论如何,我现在有了一个实现,这要感谢你之前的答案,你删除了它,所以我不能接受。我取消了它,只是为了以防万一,但将
节点
转换为
文档遍历
似乎是一个错误的假设。