JAXB xjc:简单绑定不会为基类

时间:2015-06-16 22:32:44

标签: java xml jaxb

我正在使用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> 

我对这些物品的预期用途是:

  1. 一个人可能看起来像一个单独的Marshalled元素,或者可能是People对象的一部分
  2. 如果Person是People对象的一部分,则xsi:type应指示它是普通人还是音乐家。
  3. 所以我需要生成的Java类既包含@XmlRootElement注释,也包含@XmlType注释。 xjc:simple绑定为音乐家创建两个注释,但只为Person创建@XmlType。因此,当我对一个Person对象进行Marshall时,我得到的只是:

    <?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注释。对于我正在研究的用例,必须将基类作为顶级元素和其他元素的成员进行编组。任何建议都会受到欢迎。

1 个答案:

答案 0 :(得分:0)

可以使用

https://github.com/highsource/jaxb2-annotate-plugin

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:annox="http://annox.dev.java.net"
               xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               jaxb:version="2.1"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
               jaxb:extensionBindingPrefixes="xjc annox">

    <jaxb:bindings node="//xs:complexType[@name='Person']">
        <annox:annotate>
            <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="person"/>
        </annox:annotate>
    </jaxb:bindings>
</jaxb:bindings>
相关问题