繁体   English   中英

jaxb,xsd替换复杂类型

[英]jaxb, xsd substitution complextype

我有以下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文档时,我想要一个包含按钮或文本字段的contols列表

列表->具有Button和TextField

我不知道,我认为我应该使用替代组,但是如何使用。 我尝试了一些操作,但是xsd不会生成任何Java代码。

谢谢

约翰

我建议使用xs:choice ,还定义一个目标名称空间(在我的示例中为http://my.target.namespace ),这通常可以使使用JAXB更加容易。

例如:

<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>

另一种想法,有时类型派生实际上不值得。 对于这样的事情,您也可以这样做:

例如:

<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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM