xjc 和 XSD 的选择

Posted

技术标签:

【中文标题】xjc 和 XSD 的选择【英文标题】:xjc and XSD choice 【发布时间】:2013-09-08 07:01:09 【问题描述】:

当我运行 xjc 来生成代表这个 XSD sn-p 的 Java 类型时:

  <xs:complexType name="fileUploadRequest">
    <xs:choice>
      <xs:element name="path" type="xs:string"/>
      <xs:element name="file" type="xs:base64Binary"/>
    </xs:choice>
  </xs:complexType>

如果我使用可选元素指定sequence,我得到的类与它本来的类没有区别。

我想要一种有点智能的类型,它可以让我一次最多选择一个元素。例如,如果我调用生成的setFile 方法,它应该使路径为空。是否有一些插件可以用于代码生成器的明显需求?

【问题讨论】:

【参考方案1】:

binding.xml

您可以使用以下外部绑定文件来生成您要查找的属性类型:

<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
          version="2.1">
    <globalBindings choiceContentProperty="true"/>
</bindings> 

XJC 通话

使用-b 标志引用绑定文件。

xjc -b binding.xml schema.xsd

生成的属性

现在将生成以下属性:

@XmlElements(
    @XmlElement(name = "path", type = String.class),
    @XmlElement(name = "file", type = byte[].class)
)
protected Object pathOrFile;

更多信息

http://blog.bdoughan.com/2011/04/xml-schema-to-java-xsd-choice.html

【讨论】:

好的,功能上看起来很棒,非常感谢。我想您通过检查pathOrFile 的类型(例如if (pathOrFile instanceof String))来区分路径与文件。正确的?当一些选择元素的类型是相同类型的类型? span>时,这是如何工作 @blueimpb - 当元素属于同一类型时,结果将被包裹在 JAXBElement 中以保留元素信息。

以上是关于xjc 和 XSD 的选择的主要内容,如果未能解决你的问题,请参考以下文章

Maven Xjc / Jaxb插件无法解析简单的Xsd文件

使用xjc从多个xsd文件生成Java

JAXB:如何在XSD中指定attr类型时更改XJC生成的类名?

XJC:从无效方案生成 JAXB 类

XJC 生成整数而不是 int

Java使用xml转化为JavaBean的xjc神器