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

HyperJAXB3解析含xs:any通配符的XSD遇阻,求解决方案

解决HyperJAXB3处理railML 2.2 XSD中xs:any通配符的问题

你的问题核心是HyperJAXB3目前不支持元素/属性通配符(对应官方issue #46),而你尝试的hj:ignored绑定位置不正确导致报错。下面提供两种可行的解决方案:

方案1:直接用JAXB的xjc:ignore忽略xs:any元素

既然你不需要保留这些外部命名空间的扩展元素,最直接的方法是让JAXB的XJC编译器跳过Schema中的xs:any节点,这样生成的Java类里不会有对应的属性,HyperJAXB自然不会触发通配符报错。

修改你的绑定文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:hj="http://hyperjaxb3.jvnet.org/ejb/schemas/customizations" version="2.1">
    <!-- global bindings -->
    <jaxb:globalBindings>
        <xjc:simple />
    </jaxb:globalBindings>
    <jaxb:bindings schemaLocation="genericRailML.xsd">
        <!-- 定位到tElementWithIDAndName中的xs:any元素并忽略 -->
        <jaxb:bindings node="//xs:complexType[@name='tElementWithIDAndName']//xs:sequence//xs:any">
            <xjc:ignore/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

xjc:ignore是JAXB官方的自定义绑定,作用是告诉XJC编译器跳过指定的Schema元素,不会在生成的Java类中生成对应的属性或代码。

方案2:保留属性但让HyperJAXB忽略数据库映射

如果你需要在Java对象中保留xs:any对应的属性(比如后续要处理这些扩展元素),但不需要把它映射到数据库,可以分两步处理:

  1. 给xs:any指定一个明确的属性名,让JAXB生成对应的Java属性
  2. 对这个生成的属性应用hj:ignored,让HyperJAXB不将其映射到数据库

修改后的绑定文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:hj="http://hyperjaxb3.jvnet.org/ejb/schemas/customizations" version="2.1">
    <!-- global bindings -->
    <jaxb:globalBindings>
        <xjc:simple />
    </jaxb:globalBindings>
    <jaxb:bindings schemaLocation="genericRailML.xsd">
        <!-- 给xs:any指定属性名,让JAXB生成对应的Java属性 -->
        <jaxb:bindings node="//xs:complexType[@name='tElementWithIDAndName']//xs:sequence//xs:any">
            <jaxb:property name="foreignExtensions"/>
        </jaxb:bindings>
        <!-- 针对生成的属性设置HyperJAXB忽略 -->
        <jaxb:bindings node="//xs:complexType[@name='tElementWithIDAndName']">
            <hj:ignored property="foreignExtensions"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

为什么你之前的绑定会报错?

你之前直接把hj:ignored绑定到了Schema中的xs:any节点,但hj:ignored是HyperJAXB的自定义绑定,它需要绑定到生成的Java类或类中的属性,而不是原始Schema元素。直接绑定到xs:any时,编译器无法找到对应的Java目标元素,因此抛出"绑定位置错误"的提示。

内容的提问来源于stack exchange,提问作者S-Man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:44:59