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(); } });
问题根源
- 用户名匹配逻辑错误:你用
currentNode.getFirstChild().getTextContent()获取用户名,但XML格式化后的换行、缩进会产生空白文本节点,这才是currentNode的第一个子节点,根本不是<username>元素,导致永远匹配不上要删除的用户,自然不会执行删除操作。 - 删除逻辑错误:就算匹配成功,你现在的代码会删除目标用户节点父节点下的所有元素节点,这会把所有用户都删掉,而不是只删除选中的单个用户。
修复后的删除按钮事件代码
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
相关产品推荐
相关产品推荐

