我正在使用 JAXB 2.0。我在 XSD 文件中定义了各种元素和类型。这是一个例子:
<xs:element name="Person" type="Person" />
<xs:complexType name="Person">
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
<xs:element name="Musician" type="Musician"/>
<xs:complexType name="Musician">
<xs:complexContent>
<xs:extension base="Person">
<xs:attribute name="instrument" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="People" type="People"/>
<xs:complexType name="People">
<xs:sequence>
<xs:element name="person" type="Person" minOccurs="0" maxOccurs="Unbounded/>
</xs:sequence>
</xs:complexType>
正如您从上面的模式示例中看到的,我们有一个有名字的人,还有一个音乐家,他也是一个人(尽管这可能会引起一些争论,但那是另一个论坛的事)。还有一个 People 元素,它本质上是 Person 类型的集合。
我的绑定文件中有以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0"
xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc">
<jaxb:globalBindings optionalProperty="wrapper">
<xjc:simple/>
</jaxb:globalBindings>
我对这些对象的预期用途是:
- Person 可能会显示为单独的 Marshalled 元素,也可能是 People 对象的一部分
- 如果 Person 是 People 对象的一部分,则 xsi:type 应指示它是普通 Person 还是音乐家。
因此,我需要生成的 Java 类同时包含 @XmlRootElement 注释和 @XmlType 注释。 xjc:simple 绑定为 Musician 创建两个注释,但仅为 Person 创建 @XmlType。因此,当我编组 Person 对象时,我得到的只是:
<?xml version="1.0" encoding="UTF-8"?>
而我想看到的是:
<?xml version="1.0" encoding="UTF-8"?>
<Person name="John Doe"/>
对于 People 对象,我想看到:
<?xml version="1.0" encoding="UTF-8"?>
<People>
<person name="John Doe" xsi:type="Person"/>
<person name="Keith Richards" xsi:type="Musician"/>
</People>
我读过有关 xjc 的简单绑定的内容,它适用于继承层次结构中的所有最低级别。但是,基类最终没有 @XmlRootElement 注释。对于我正在处理的用例,基类必须能够编组为顶级元素和其他元素的成员。欢迎大家提出意见。