我使用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
答案 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>
这对我来说非常适合