JAXB XJC绑定:将@XmlRootElement和@XmlType重命名

时间:2016-04-18 12:50:17

标签: java xml xsd jaxb

我有以下XML架构:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="cg" type="cgType"/>

    <xsd:complexType name="cgType">
        <xsd:sequence>
            <xsd:element name="code" type="upperCaseString" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="action" type="cgAction" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="param" type="xsd:string" minOccurs="0" maxOccurs="unbounded" nillable="true"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="automated" type="xsd:boolean" default="false" use="optional"/>
    </xsd:complexType>

    <xsd:simpleType name="cgAction">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="TAKE"/>
            <xsd:enumeration value="CLEAR"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="upperCaseString">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="[A-Z]*"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

编辑:我还有以下全局绑定:

<?xml version="1.0" encoding="UTF-8" ?>
<jaxb:bindings
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        jaxb:version="2.1">

    <jaxb:bindings schemaLocation="cg.xsd" node="/xsd:schema">
        <jaxb:globalBindings>
            <xjc:simple/>
        </jaxb:globalBindings>
    </jaxb:bindings>
</jaxb:bindings>

使用XJC生成类可以按预期工作,其中一个名为Cg的类同时具有@XmlType@XmlRootElement注释。我想将该类重命名为CG,因此我将绑定文件更改为:

<?xml version="1.0" encoding="UTF-8" ?>
<jaxb:bindings
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        jaxb:version="2.1">

    <jaxb:bindings schemaLocation="cg.xsd" node="/xsd:schema">
        <jaxb:schemaBindings>
            <jaxb:package name="foo.bar.cg"/>
        </jaxb:schemaBindings>

        <jaxb:bindings node="//xsd:element[@name='cg']">
            <jaxb:class name="CG"/>
        </jaxb:bindings>
        <jaxb:bindings node="//xsd:complexType[@name='cgType']">
            <jaxb:class name="CG"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

这导致XJC抱怨两个CG类之间的ObjectFactory类中的冲突。如果我删除了xsd:element上的绑定,XJC现在会按预期创建一个CG类,但它会错过@XmlRootElement注释。我已在elementcomplexType上尝试了各种绑定组合,但无法简单地重命名默认生成的类。

如何一次重命名elementcomplexType

1 个答案:

答案 0 :(得分:0)

elementcomplexType都是他们自己的java类。如果不使用绑定文件,您应该获得2个类文件的结果:Cg.javaCgType.java。在您的绑定中,您尝试将这两个重命名为CG.java,这当然是不可能的。

您可能正在寻找的是将complexType重命名为CGType,在这种情况下,您的绑定应为:

...
    <jaxb:bindings node="//xsd:element[@name='cg']">
        <jaxb:class name="CG"/>
    </jaxb:bindings>
    <jaxb:bindings node="//xsd:complexType[@name='cgType']">
        <jaxb:class name="CGType"/>
    </jaxb:bindings>
...