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

JAXB unmarshalling解析XML返回Saccreq空列表问题求解

故障根因

你的JAXB注解配置本身没有错误,解析返回空列表的核心原因是传入的XML字符串存在实体转义问题:<MT94x>标签包裹的所有内层标签都被转义成了HTML实体格式——所有左尖括号<被替换为&lt;,右尖括号>被替换为&gt;。
JAXB解析时会把这部分转义后的内容识别为<MT94x>节点下的纯文本内容,而非结构化的<saccreq>子节点,自然无法完成子节点到List<Saccreq>字段的映射,最终返回空列表。

修复方法
  • 优先选择:在执行JAXB反序列化前,先对原始XML字符串做一次XML实体反转义,把转义字符还原为正常的XML标签,再传入解析逻辑即可。
    简单场景可以直接用字符串替换实现:
    public static void main(String[] args) {
        String data = "<MT94x>&lt;saccreq&gt;&lt;id&gt;979373531_410&lt;/id&gt;&lt;code&gt;1&lt;/code&gt;&lt;state&gt;BEGIN&lt;/state&gt;&lt;/saccreq&gt;......</MT94x>";
        // 新增:反转义XML实体
        String validXml = data.replace("&lt;", "<").replace("&gt;", ">");
        MT94x result = stringToObject(validXml, MT94x.class);
        System.out.println(result.getSaccreq());
    }
    
    如果数据中可能存在&amp;、&quot;等其他XML转义实体,建议用标准XML反转义工具处理(比如Apache Commons Text提供的StringEscapeUtils.unescapeXml()方法),避免手动替换遗漏场景。
  • 适配特殊业务场景:如果上游接口的设计就是将内层saccreq内容作为转义字符串存在MT94x节点下,你需要调整映射逻辑:先给MT94x类配置@XmlValue字段读取MT94x节点下的纯文本内容,再对拿到的文本内容单独做一次JAXB反序列化,转换为Saccreq列表即可。
补充校验项

如果完成上述修改后仍解析失败,可以在创建JAXBContext时显式传入所有关联类,避免类扫描遗漏:

final JAXBContext jaxbContext = JAXBContext.newInstance(clazz, Saccreq.class);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:27:29