You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java代码仅删除ComboBox用户,无法删除XML文件数据求助

问题:无法从XML文件中删除选中的用户数据

我写的代码只能从ComboBox中删除选中的用户名,但没法同步删除XML文件里的对应数据,找不到问题出在哪。

代码运行界面:
代码运行界面

以下是我的代码片段:

public DeleteUserFrame() throws ParserConfigurationException, IOException, SAXException {
        String path = "res/credentials.xml";
        File f = new File(path);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder build = dbf.newDocumentBuilder();
        Document doc = build.parse(f);

        /* Combobox contents */
        try {
            doc.getDocumentElement().normalize();
            NodeList nList = doc.getElementsByTagName("user");
            for (int temp = 0; temp < nList.getLength(); temp++) {
                Element nNode = (Element) nList.item(temp);
                String username = nNode.getElementsByTagName("username").item(0).getTextContent();
                String isAdmin = nNode.getElementsByTagName("isAdmin").item(0).getTextContent();
                if (isAdmin.equals("false")) {
                    userList.addItem(username);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        /* Button Events */
        deleteUserButton.addActionListener(delete -> {
            String deleteUser = (String) userList.getSelectedItem();
            try {
                NodeList nList = doc.getElementsByTagName("user");
                for (int temp = 0; temp < nList.getLength(); temp++){
                    Node currentNode = nList.item(temp);
                    String userName = currentNode.getFirstChild().getTextContent();
                    if (userName.equalsIgnoreCase(deleteUser)){
                        Node user = currentNode.getParentNode();
                        NodeList siblings = user.getChildNodes();
                        for (int i = 0; i < siblings.getLength(); i++) {
                            Node sibling = siblings.item(i);
                            if (sibling.getNodeType() == Node.ELEMENT_NODE) {
                                user.removeChild(sibling);
                            }
                        }
                    }
                }
                userList.removeItem(deleteUser);
                Transformer transformer = TransformerFactory.newInstance().newTransformer();
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                StreamResult result = new StreamResult(f);
                DOMSource source = new DOMSource(doc);
                transformer.transform(source, result);

                System.out.println("User (" + deleteUser + ") deleted!");

            } catch (TransformerConfigurationException e) {
                throw new RuntimeException(e);
            } catch (TransformerException e) {
                e.printStackTrace();
            }
        });

问题根源

  1. 用户名匹配逻辑错误:你用currentNode.getFirstChild().getTextContent()获取用户名,但XML格式化后的换行、缩进会产生空白文本节点,这才是currentNode的第一个子节点,根本不是<username>元素,导致永远匹配不上要删除的用户,自然不会执行删除操作。
  2. 删除逻辑错误:就算匹配成功,你现在的代码会删除目标用户节点父节点下的所有元素节点,这会把所有用户都删掉,而不是只删除选中的单个用户。

修复后的删除按钮事件代码

deleteUserButton.addActionListener(delete -> {
    String deleteUser = (String) userList.getSelectedItem();
    try {
        NodeList nList = doc.getElementsByTagName("user");
        // 倒序遍历NodeList,避免删除节点后索引混乱
        for (int temp = nList.getLength() - 1; temp >= 0; temp--) {
            Element currentUser = (Element) nList.item(temp);
            // 复用初始化ComboBox时的正确方式获取用户名
            String userName = currentUser.getElementsByTagName("username").item(0).getTextContent();
            if (userName.equalsIgnoreCase(deleteUser)) {
                // 直接删除目标<user>节点
                currentUser.getParentNode().removeChild(currentUser);
                break; // 找到目标后退出循环,避免无效遍历
            }
        }
        userList.removeItem(deleteUser);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        StreamResult result = new StreamResult(f);
        DOMSource source = new DOMSource(doc);
        transformer.transform(source, result);

        System.out.println("User (" + deleteUser + ") deleted!");

    } catch (TransformerConfigurationException e) {
        throw new RuntimeException(e);
    } catch (TransformerException e) {
        e.printStackTrace();
    }
});

关键修复点

  • 正确获取用户名:复用初始化ComboBox时的逻辑,通过getElementsByTagName("username")定位到对应元素,避免空白节点干扰匹配。
  • 精准删除节点:找到目标<user>节点后,直接让其父节点删除该节点即可,无需遍历所有兄弟节点。
  • 倒序遍历NodeList:NodeList是动态集合,删除节点后后续元素索引会偏移,倒序遍历能避免漏删或索引越界问题。

内容的提问来源于stack exchange,提问作者Guren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:53:14