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
以及上述解决方案的作者。
我想配置 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
以及上述解决方案的作者。