使用Java中的DocumentTraversal以递归方式遍历XML元素

时间:2013-08-23 10:40:17

标签: 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_ELEMENT, null, false);
    Node node = i.nextNode();
    while (node != null) {
        // do stuff   
        node = i.nextNode();
    }
    return ...
}

但是,如何将上述内容概括为允许遍历文档的随机XML元素,而不仅仅是文档整体?这在理论上应该很容易,因为在XML中文档可以简单地看作最外层的元素,但API是反直觉的。

换句话说,您如何编写上述函数以ElementNode作为参数?

更新

解决方案似乎是:

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 ...
}

2 个答案:

答案 0 :(得分:1)

让您的方法采用Node代替Document。请注意,DocumentTraversal需要Node

答案 1 :(得分:1)

因此,我在Iterator周围实施了Iterable / NodeList包装器。它只是使用NodeList.getLength()来确定元素的数量。所以我要做的是将Node传递给方法并使用Node.getChildNodes()。您可以直接使用NodeList或将其包装在Iterator