使用DocumentTraversal一个XML元素和它的作品相当不错:递归遍历的Java
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是反直觉的。
换句话说,你会如何编写上述函数以Element
或Node
作为参数?
UPDATE
解决方案似乎是:
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 ...
}
首先,是不是冒险的假设,即传递的'Document'实现'DocumentTraversal'? javadoc指出:“在支持遍历功能的DOM中,DocumentTraversal将由实现Document接口的相同对象实现。”所以我认为你不可能总是做出这个假设。 –