使用XJC解析XTCE官方XSD生成JAXB时enumeration含<字符报错如何解决
问题原因
- 该报错是JDK内置的旧版本JAXB xjc工具的已知bug,并非OMG发布的XTCE标准XSD本身存在语法错误:XSD中枚举值的
<、>已经按XML规范转义为<、>,完全符合语法要求。 - 旧版本xjc在解析XML属性值时,会先将转义字符还原为原始字符再做合法性校验,错误地将还原后的
<识别为XML标签起始符,触发非法字符拦截逻辑。 - 你添加的
-nv(关闭XSD校验)、-extension参数不生效,是因为该校验发生在XML实体解析阶段,早于XSD语义校验流程,参数无法覆盖该环节的校验规则。
解决方案
以下方案均不需要修改官方原XSD文件:
方案1:使用独立版高版本xjc工具(推荐)
JDK 9之后JAXB已经从JDK核心组件中剥离,独立维护的新版JAXB已经修复了该bug:
- 下载最新版JAXB RI(参考实现)压缩包,解压后获取bin目录下的独立xjc可执行文件
- 执行命令替换内置版本生成代码:
./xjc SpaceSystem.xsd
方案2:使用XSD重定义机制兼容旧版xjc
如果只能使用当前内置的xjc版本,可以通过XML Schema的redefine特性在不修改原文件的前提下覆盖问题类型定义:
- 新建补丁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="<"/> <xs:enumeration value="<="/> <xs:enumeration value=">"/> <xs:enumeration value=">="/> </xs:restriction> </xs:simpleType> </xs:redefine> </xs:schema>
- 执行命令指定wrapper文件生成代码:
xjc xtce-wrapper.xsd
方案3:构建工具场景替换依赖
如果是通过Maven/Gradle等构建工具执行xjc生成代码,直接在构建配置中引入高版本的org.glassfish.jaxb:jaxb-xjc依赖,替换内置的JAXB实现即可,原有执行逻辑无需修改。
内容的提问来源于stack exchange,提问作者Onur Gürdoğan
相关产品推荐
相关产品推荐

