2

我一直在使用以下代码结构来遍历 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 是违反直觉的。

换句话说,您将如何编写上述函数以将 aElement或 aNode作为参数?

更新

解决方案似乎是:

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

2 回答 2

1

所以,我已经实现了一个Iterator/Iterable包装器NodeList。它只是用来NodeList.getLength()确定元素的数量。所以我要做的就是将 a 传递Node给方法并使用Node.getChildNodes(). 您可以NodeList直接使用,也可以将其包装在Iterator.

于 2013-08-23T10:51:38.273 回答
1

让您的方法采用 aNode而不是 a Document。注意DocumentTraversal需要Node.

于 2013-08-23T10:44:17.290 回答