在NodeList上迭代时设置DOM元素属性会导致性能开销

时间:2012-10-21 04:05:32

标签: java xml dom nodelist

当我在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”)替换setting属性行,则不会设置该标志。为什么删除属性不被视为更改DOM文档的操作?

1 个答案:

答案 0 :(得分:0)

如果那是真正发生的事情,那么你可以通过迭代NodeList并在遇到它们时将元素存储在ArrayList中来构建匹配的所有节点的列表(例如ArrayList)。然后,一旦你拥有了ArrayList中的所有元素,就会迭代回到ArrayList进行编辑。