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

使用XJC解析XTCE官方XSD生成JAXB时enumeration含<字符报错如何解决

问题原因
  • 该报错是JDK内置的旧版本JAXB xjc工具的已知bug,并非OMG发布的XTCE标准XSD本身存在语法错误:XSD中枚举值的<、>已经按XML规范转义为&lt;、&gt;,完全符合语法要求。
  • 旧版本xjc在解析XML属性值时,会先将转义字符还原为原始字符再做合法性校验,错误地将还原后的<识别为XML标签起始符,触发非法字符拦截逻辑。
  • 你添加的-nv(关闭XSD校验)、-extension参数不生效,是因为该校验发生在XML实体解析阶段,早于XSD语义校验流程,参数无法覆盖该环节的校验规则。
解决方案

以下方案均不需要修改官方原XSD文件:

方案1:使用独立版高版本xjc工具(推荐)

JDK 9之后JAXB已经从JDK核心组件中剥离,独立维护的新版JAXB已经修复了该bug:

  1. 下载最新版JAXB RI(参考实现)压缩包,解压后获取bin目录下的独立xjc可执行文件
  2. 执行命令替换内置版本生成代码:
./xjc SpaceSystem.xsd

方案2:使用XSD重定义机制兼容旧版xjc

如果只能使用当前内置的xjc版本,可以通过XML Schema的redefine特性在不修改原文件的前提下覆盖问题类型定义:

  1. 新建补丁XSD文件xtce-wrapper.xsd,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:redefine schemaLocation="SpaceSystem.xsd">
    <xs:simpleType name="ComparisonOperatorsType">
      <xs:restriction base="xs:string">
        <xs:enumeration value="=="/>
        <xs:enumeration value="!="/>
        <xs:enumeration value="&#60;"/>
        <xs:enumeration value="&#60;="/>
        <xs:enumeration value="&#62;"/>
        <xs:enumeration value="&#62;="/>
      </xs:restriction>
    </xs:simpleType>
  </xs:redefine>
</xs:schema>
  1. 执行命令指定wrapper文件生成代码:
xjc xtce-wrapper.xsd

方案3:构建工具场景替换依赖

如果是通过Maven/Gradle等构建工具执行xjc生成代码,直接在构建配置中引入高版本的org.glassfish.jaxb:jaxb-xjc依赖,替换内置的JAXB实现即可,原有执行逻辑无需修改。

内容的提问来源于stack exchange,提问作者Onur Gürdoğan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:24:00