jaxb,xsd替换complextype

时间:2017-03-10 10:54:40

标签: java xml xsd jaxb

我有以下xsd

<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="screen">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="name" type="xs:string"></xs:element>
            <xs:element name="controls" type="Controls"></xs:element>
        </xs:sequence>
        <xs:attribute name="ref" type="xs:string"></xs:attribute>
    </xs:complexType>
</xs:element>

<xs:complexType name="Controls">
    <xs:sequence>
        <xs:element name="control" type="Control" minOccurs="0" maxOccurs="unbounded"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="Control" abstract="true">
    <xs:sequence>
        <xs:element name="name" type="xs:string"></xs:element>
        <xs:element name="id" type="xs:string"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="Button">
    <xs:complexContent>
        <xs:extension base="Control">
            <xs:sequence>
                <xs:element name="action" type="xs:string"></xs:element>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="TextField">
    <xs:complexContent>
        <xs:extension base="Control">
            <xs:sequence>
                <xs:element name="value" type="xs:string"></xs:element>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

如何生成以下xml文档

<?xml version = "1.0"?>
<screen ref="10_20_25_vwopstellen">
    <name>VWOpstellen</name>
    <controls>
        <button>
            <name>btnA</name>
            <id>btn_10</id>
            <action>click</action>
        </button>
        <textfield>
            <name>fldA</name>
            <id>fld_20</id>
        </textfield>
    </controls>
</screen>

现在它正在生成以下xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<screen ref="scrVWOpstellen">
    <name>VWOpstellen</name>
    <controls>
        <control xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Button">
            <name>btnA</name>
        </control>
        <control xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Button">
            <name>btnB</name>
        </control>
    </controls>
</screen>

当我阅读我的xml文档时,我想要一个包含按钮或文本字段的控制列表

列表 - &gt;有Button和TextField

我不知道,我想我应该使用替换组,但是如何。我尝试了一些东西,但xsd没有生成任何java代码。

谢谢

约翰

1 个答案:

答案 0 :(得分:1)

我建议使用 xs:choice ,并定义目标命名空间,(在我的示例中为 http://my.target.namespace ),这可以使用JAXB一般比较容易。

E.g:

<xs:schema targetNamespace="http://my.target.namespace" xmlns:tns="http://my.target.namespace" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="screen">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"></xs:element>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element name="button" type="tns:Button" />
                    <xs:element name="textfield" type="tns:TextField" />
                </xs:choice>
            </xs:sequence>
            <xs:attribute name="ref" type="xs:string"></xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="Control" abstract="true">
        <xs:sequence>
            <xs:element name="name" type="xs:string"></xs:element>
            <xs:element name="id" type="xs:string"></xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Button">
        <xs:complexContent>
            <xs:extension base="tns:Control">
                <xs:sequence>
                    <xs:element name="action" type="xs:string"></xs:element>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="TextField">
        <xs:complexContent>
            <xs:extension base="tns:Control">
                <xs:sequence>
                    <xs:element name="value" type="xs:string"></xs:element>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

</xs:schema>

另一种想法,有时类型推导并不值得。对于这样的事情你也可以这样做:

E.g:

<xs:schema targetNamespace="http://my.target.namespace" xmlns:tns="http://my.target.namespace" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="screen">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"></xs:element>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element name="button" type="tns:Button" />
                    <xs:element name="textfield" type="tns:TextField" />
                </xs:choice>
            </xs:sequence>
            <xs:attribute name="ref" type="xs:string"></xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="Button">
        <xs:sequence>
            <xs:element name="name" type="xs:string"></xs:element>
            <xs:element name="id" type="xs:string"></xs:element>
            <xs:element name="action" type="xs:string"></xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="TextField">
        <xs:sequence>
            <xs:element name="name" type="xs:string"></xs:element>
            <xs:element name="id" type="xs:string"></xs:element>
            <xs:element name="value" type="xs:string"></xs:element>
        </xs:sequence>
    </xs:complexType>

</xs:schema>