Java 8更新XML文件仅最后一个节点成功添加子节点问题求助
问题原因
你的问题核心是全局仅创建了一个<test>节点实例。W3C DOM规范中,同一个节点对象无法同时挂载到多个父节点下。每次调用appendChild(testNode)时,该节点会先从已绑定的父节点上被移除,再挂载到当前调用appendChild的父节点中。三次循环执行完毕后,这个唯一的test节点最终只会保留在最后一个game节点下,和你观察到的现象完全匹配。
解决方案
将test节点的创建逻辑挪到循环内部,每次处理game节点时都新建一个独立的test节点实例即可,修改后代码如下:
public static void parseXML() { NodeList nodeList = doc.getElementsByTagName("game"); // 移除全局创建testNode的逻辑,挪到循环内 //Get each node from nodeList for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); //Get child elements of node and store in nodeCheck ArrayList ArrayList<String> nodeCheck = new ArrayList<String>(); for (int j = 0; j < node.getChildNodes().getLength(); j++) { nodeCheck.add(node.getChildNodes().item(j).getNodeName()); } //Add test element <test/> if it is not found in nodeCheck ArrayList if (!nodeCheck.contains("test")) { // 每次循环新建一个test节点 Node testNode = doc.createElement("test"); node.appendChild(testNode); if (node.getLastChild().getNodeName().equals("test")) { System.out.println("node exists!"); } } } writeXmlFile(); }
补充说明
如果你需要创建的子节点结构比较复杂,不想每次都重复写创建逻辑,也可以先创建一个模板节点,每次使用时调用模板节点.cloneNode(true)进行深拷贝,效果和新建节点一致。
内容的提问来源于stack exchange,提问作者gangstaShanks
相关产品推荐
相关产品推荐

