3

我在迭代 NodeList 时修改 DOM 元素属性时遇到性能问题。

<!-- language: lang-java -->
public static void overwriteSumDef(Document doc){
    NodeList nl = doc.getElementsByTagName("Session");
    int length = nl.getLength();

    for(int i=0; i<length; i++){
        Element elem = (Element)nl.item(i);
        elem.setAttribute("sum-def", "MON-SUN");
        //elem.removeAttribute("sum-def");
    }
}

我已经下载了 Apache Xerces2 Java 代码并尝试调试内部实现。似乎 elem.setAttribute() 将在 Document 中设置一个标志,指示该文档已更改,然后在下次我尝试获取下一个匹配元素时,NodeList 将清除当前匹配元素列表并从根开始搜索重新节点(如果我错了,请纠正我)。由于此处的根节点是文档节点,因此如果在我的目标元素之前有数千个元素,则会导致大量开销。我的问题是:

  1. 这是不可避免的,因为 NodeList 需要根据 DOM 规范“活动”吗?还是有其他实现可以更有效地处理这个问题?

  2. 如果我用 elem.removeAttribute("sum-def") 替换设置属性行,则不会设置标志。为什么不将删除属性视为更改 DOM 文档的操作?

4

1 回答 1

0

如果确实发生了这种情况,那么您可以通过迭代 NodeList 并将遇到的元素存储在 ArrayList 中来构建所有匹配节点的列表(例如 ArrayList)。然后,一旦您拥有 ArrayList 中的所有元素,就可以遍历 ArrayList 进行编辑。

于 2012-10-21T04:11:59.740 回答