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

时间:2018-01-02 08:41:31

标签: xml xpath jaxb xjc

我想配置 xjc 以使用 jaxb2-basics-annotate 插件在生成的Java类中注释某个属性,但我正在努力解决特定的XML元素使用 XPath

以下是 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类如下所示:

....
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的扩展名。

1 个答案:

答案 0 :(得分:1)

请参阅this issue了解解决方案。

我只是在这里复制粘贴解决方案,以避免仅限于链接&#34; downvotes。

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

它是如何运作的:

  • 包括jaxb2-basics
  • 启用-Xcustomizations插件,并将-Xcustomizations-directory=<dir>指向要从中加载自定义文件的目录。例如,${basedir}/src/main/resources
  • 创建一个以您要自定义的类和/或属性命名的文件。例如,对于value类的org.jvnet.jaxb2_commons.tests.issues.Gh24Type属性,您将拥有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的作者以及上述解决方案。