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对应的属性(比如后续要处理这些扩展元素),但不需要把它映射到数据库,可以分两步处理:
- 给
xs:any指定一个明确的属性名,让JAXB生成对应的Java属性 - 对这个生成的属性应用
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
相关产品推荐
相关产品推荐

