2017-03-10 137 views
0

我有以下XSDJAXB,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列表 - >有按鈕和文本字段

我不知道,我想我應該用置換組,但如何。我嘗試了一些,但是xsd沒有生成任何java代碼。

感謝

約翰

回答

1

我建議使用的xs:選擇,也定義了目標命名空間,(在我的例子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>