You need to enable JavaScript to run this app. Java 8更新XML文件仅最后一个节点成功添加子节点问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 21:36:12