Java读取XML的<Group>和<Groups>元素始终返回null的问题
问题分析与解决方案
你的代码存在三个核心问题,导致无法正确获取用户所属的组名:
- 错误捕获组名内容:XML中的换行、空格等空白字符也会触发
CHARACTERS事件,你直接读取会把无效空白赋值给groupName,而非<name>元素的实际文本。 - 未重置组标记:进入
<group>元素后,没有在结束时重置insideGroup标记,导致后续逻辑判断混乱。 - 不支持多组存储:一个用户属于多个组,单个
String变量只能保留最后一次读取的内容,无法记录所有组名。
修改后的代码
package com.zendesk2helix.maven.zendesk2helix_jar; import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; public class Usuarios { public static void main(String[] args) { String xmlFilePath = "/home/barcat/users.xml"; try { XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream(xmlFilePath)); String id = ""; String userName = ""; // 用集合存储用户的所有组名 List<String> groupNames = new ArrayList<>(); boolean insideUser = false; boolean insideGroup = false; // 标记是否处于组的<name>元素内 boolean insideGroupName = false; while (reader.hasNext()) { int eventType = reader.next(); if (eventType == XMLStreamConstants.START_ELEMENT) { String elementName = reader.getLocalName(); switch (elementName) { case "user": insideUser = true; break; case "id": // 仅读取用户层级的id if (insideUser && !insideGroup) { id = reader.getElementText().trim(); } break; case "name": if (insideUser && !insideGroup) { // 读取用户名 userName = reader.getElementText().trim(); } else if (insideGroup) { // 标记进入组名元素 insideGroupName = true; } break; case "group": if (insideUser) { insideGroup = true; } break; } } else if (eventType == XMLStreamConstants.CHARACTERS) { // 仅在组名元素内读取有效文本 if (insideGroupName) { String text = reader.getText().trim(); if (!text.isEmpty()) { groupNames.add(text); } insideGroupName = false; } } else if (eventType == XMLStreamConstants.END_ELEMENT) { String elementName = reader.getLocalName(); switch (elementName) { case "group": // 离开组元素时重置标记 insideGroup = false; break; case "user": // 输出用户完整信息 System.out.println("ID: " + id); System.out.println("User Name: " + userName); System.out.println("Group Names: " + String.join(", ", groupNames)); System.out.println("-----------------------------"); // 重置变量与标记,准备读取下一个用户 id = ""; userName = ""; groupNames.clear(); insideUser = false; insideGroup = false; break; } } } reader.close(); } catch (Exception e) { e.printStackTrace(); } } }
关键修改说明
- 新增
insideGroupName标记,精准捕获组名元素内的文本,避免空白字符干扰。 - 使用
List<String>存储多组名称,适配一个用户属于多个组的场景。 - 在
END_ELEMENT事件中处理<group>的结束,及时重置insideGroup标记。 - 读取文本时调用
trim()去除首尾空白,确保获取有效内容。
内容的提问来源于stack exchange,提问作者Barcat
相关产品推荐
相关产品推荐

