从选择中使用jaxb从xsd生成java类

时间:2014-10-01 09:59:16

标签: java maven jaxb xsd

我使用maven和jaxb从模式中创建类。此架构有以下选择:

<tns:choice minOccurs="1" maxOccurs="unbounded">
  <tns:element name="video_track" type="tcore:TTrack" minOccurs="1" maxOccurs="1"/>
  <tns:element name="audio_track" type="tcore:TTrack" minOccurs="1" maxOccurs="1"/>
</tns:choice>

改进是,我们想要一个包含x audiotracks和/或x videotracks的列表。我们至少需要一个音频或视频轨道!

当我使用此选项生成类时,我会得到以下代码:

@XmlElementRefs({
    @XmlElementRef(name = "audio_track", type = JAXBElement.class),
    @XmlElementRef(name = "video_track", type = JAXBElement.class)
})
protected List<JAXBElement<TTrack>> videoTrackOrAudioTrack;

这不是我们想要的。我认为我的信息松散,因为有TTracks列表,我不知道这是视频还是音频。

那我在这里做错了什么?

在maven中我使用org.jvnet.jaxb2.maven2版本0.8.3

2 个答案:

答案 0 :(得分:4)

不,你不会丢失这些信息。

您会看到JAXBElement<TTrack>的列表。因此,您可以查看e.getName()以查看它是音频还是视频曲目。

您可以使用我的Simplify plugin在不同的属性中获取音频和视频曲目。这不完全是您的架构中的模型,但非常接近并且更容易使用。

此自定义:

<xs:complexType name="typeWithReferencesProperty">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="a" type="someType">
            <xs:annotation>
                <xs:appinfo>
                    <simplify:as-element-property/>
                </xs:appinfo>
            </xs:annotation>
        </xs:element>
        <xs:element name="b" type="someType"/>
    </xs:choice>
</xs:complexType>

产地:

@XmlElement(name = "a")
protected List<SomeType> a;
@XmlElement(name = "b")
protected List<SomeType> b;

获得此模型的原因是maxOccurs上的choice

还要考虑为XML Schema使用xs:xsd:前缀。

答案 1 :(得分:2)

我用.xjb文件中的简化方法解决了这个问题:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:annox="http://annox.dev.java.net" xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" version="2.1" xmlns:simplify="http://jaxb2-commons.dev.java.net/basic/simplify" extensionBindingPrefixes="simplify">

  <jaxb:bindings schemaLocation="http://xxx/Core.xsd">
    <jaxb:bindings node="/xs:schema/xs:complexType[@name='TStreamRecorder']/xs:sequence/xs:choice/xs:element[1]">
      <simplify:as-element-property />
    </jaxb:bindings>
  </jaxb:bindings>

</jaxb:bindings>

要激活此插件,我将我的maven .pom文件更改为:

  <plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <executions>
      <execution>
        <id>process-xsd</id>
        <goals>
          <goal>generate</goal>
        </goals>

        <phase>generate-sources</phase>
        <configuration>
          <args>
            <arg>-Xsimplify</arg>
            <arg>-Xannotate</arg>                
          </args>

          <schemas>
            <schema>
              <url>http://xxxConfiguration.xsd</url>
            </schema>
          </schemas>

          <bindingIncludes>
            <include>schema/configBinding.xjb</include>
            <include>schema/coreBinding.xjb</include>
          </bindingIncludes>


        </configuration>
      </execution>
    </executions>
  </plugin>

这对我来说非常适合