JAXB 绑定 - 使用 xpath 处理 xs:string 扩展的地址内容

JAXB bindings - address content of an xs:string extension with xpath

我想配置 xjc 使用 jaxb2-basics-annotate 在生成的 Java class 中注释某个属性 插件,但我正在努力使用 XPath.

来解决特定的 XML 元素

这里是 xsd 的摘录(顺便说一句,我自己无法更改):

<xs:complexType name="ExpressionType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:string" use="required"/>
            </xs:extension>
        </xs:simpleContent>
</xs:complexType>

对应的 xjc 生成的 Java class 看起来像这样:

....
public class ExpressionType
{

    @XmlValue
    protected String value;
    @XmlAttribute(name = "id", required = true)
    protected String id;

    ...

bindings.xjb 文件中,我想配置 Java 属性 value 通过注释 XmlJavaTypeAdapter 进行注释,所以像这样:

<jxb:bindings node="//xs:complexType[@name='ExpressionType']/<???>" multiple="true">
    <annox:annotate target="field">@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(MyOwnCdataAdapter.class)</annox:annotate>
</jxb:bindings>

三个???指的是我的问题;-):如何在XPath中处理映射到Java属性value的内部内容?

对于 id 属性我成功使用了

//xs:complexType[@name='ExpressionType']/xs:simpleContent/xs:extension/xs:attribute[@name='id']

但是对于我的需求,我没有看到xpath中如何表达这个,也反映了该类型是xs:string的扩展。

请参阅this issue解决方法。

我只是在此处复制粘贴解决方案以避免 "link-only" 否决票。


这似乎比我想象的要复杂。我没有设法使用标准 XJC 方法将自定义附加到简单的内容派生 属性。所以我写了 customizations 插件,它从文件中读取定制,与 classes 或字段相关联。例如,org\jvnet\jaxb2_commons\tests\issues\Gh24Type.value.xml 自定义 value 属性 的 org.jvnet.jaxb2_commons.tests.issues.Gh24Type class。

它是如何工作的:

  • 包括jaxb2-basics
  • 启用 -Xcustomizations 插件并将 -Xcustomizations-directory=<dir> 指向您要从中加载自定义文件的任何目录。例如,${basedir}/src/main/resources.
  • 创建一个以您要自定义的 class and/or 属性 命名的文件。例如,对于 org.jvnet.jaxb2_commons.tests.issues.Gh24Type class 的 value 属性,您将拥有 src/main/resources/org/jvnet/jaxb2_commons/tests/issues/Gh24Type.value.xml 文件。
  • 将您的自定义设置放入此文件。必须有效 XML,例如:

    @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(MyOwnCdataAdapter.class)

参见 this project,尤其是 Gh24Type

新功能已随 jaxb2-basics 1.0.3 版一起发布。

希望这对您有所帮助。


免责声明:我是 jaxb2-annotate-plugin 以及上述解决方案的作者。