我在迭代 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 将清除当前匹配元素列表并从根开始搜索重新节点(如果我错了,请纠正我)。由于此处的根节点是文档节点,因此如果在我的目标元素之前有数千个元素,则会导致大量开销。我的问题是:
这是不可避免的,因为 NodeList 需要根据 DOM 规范“活动”吗?还是有其他实现可以更有效地处理这个问题?
如果我用 elem.removeAttribute("sum-def") 替换设置属性行,则不会设置标志。为什么不将删除属性视为更改 DOM 文档的操作?