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

Java读取XML的<Group>和<Groups>元素始终返回null的问题

问题分析与解决方案

你的代码存在三个核心问题,导致无法正确获取用户所属的组名:

  1. 错误捕获组名内容:XML中的换行、空格等空白字符也会触发CHARACTERS事件,你直接读取会把无效空白赋值给groupName,而非<name>元素的实际文本。
  2. 未重置组标记:进入<group>元素后,没有在结束时重置insideGroup标记,导致后续逻辑判断混乱。
  3. 不支持多组存储:一个用户属于多个组,单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:17:02