从同一Jaxb模式文件创建多个@XmlRootElements

时间:2015-12-04 17:01:18

标签: java xml xsd jaxb

我有以下JAXB .xsd架构文件:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
       jaxb:version="2.1" xmlns="some.namespace.com"
       targetNamespace="some.namespace.com">

    <xs:element name="outerModel">
        <xs:annotation>
            <xs:appinfo>
                <jaxb:class name="OuterModelDto" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" minOccurs="0" name="innerModel" type="innerModelDto" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="innerModelDto">
        <xs:sequence>
            <xs:element name="fullname" type="xs:string" />
            <xs:element name="surname" type="xs:string" />
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" use="required" />
    </xs:complexType>
</xs:schema>

这将创建OuterModelDtoInnerModelDto类。 OuterModelDto注释为@XmlRootElement,但InnerModelDto未注明。如何确保InnerModelDto也注明了@XmlRootElement

一个解决方案是将innerModelDto complexType包装在一个元素中,这意味着我在@XmlRootElement的两个Dto上都有OuterModelDto,但在$('button.btn', this ).attr('id', index);的序列化过程中,命名空间信息是序列化的,我不想要。

2 个答案:

答案 0 :(得分:1)

您可以分离架构中的complexTypeelement定义。每个element都会生成@XmlRootElement注释。

确保在架构中声明了一些名称空间前缀,以便能够引用类型,请参阅此处的xmlns:tns

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
   jaxb:version="2.1"
   targetNamespace="some.namespace.com"
   xmlns:tns="some.namespace.com">

    <xs:complexType name="OuterModelDto">
        <xs:sequence>
            <xs:element maxOccurs="unbounded" minOccurs="0" name="innerModel" type="innerModelDto" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="InnerModelDto">
        <xs:sequence>
            <xs:element name="fullname" type="xs:string" />
            <xs:element name="surname" type="xs:string" />
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" use="required" />
    </xs:complexType>

    <xs:element name="outerModel" type="tns:OuterModelDto" />
    <xs:element name="innterModel" type="tns:InnerModelDto" />

</xs:schema>

答案 1 :(得分:0)

您可以使用我的jaxb2-annotate-plugin使用innerModelDto注释@XmlRootElement。通过Xstian看到(和upvote)这个答案:

绑定就像:

<bindings node="xs:complexType[@type='innerModelDto']">
    <annox:annotateClass>@javax.xml.bind.annotation.XmlRootElement(name="innerModel")</annox:annotateClass>
</bindings>

免责声明:我是jaxb2-annotate-plugin的作者。