2010-07-02 98 views
0

我正在使用我打算與JAXB一起使用的模式文件來處理我的項目。在Java中,我有那種代碼結構如下XML模式繼承與OOP繼承的工作方式相同嗎?

public interface Condition { 
    ... 
} 

public class AndCondition implements Condition { 
    public AndCondition(List<Condition> conditions){ 
     ... 
    } 
} 

public class StateCondition implements Condition { 
    public StateCondition(Item item, String attributeName, String attributeValue){ 
     ... 
    } 
} 

當然我在我的代碼中的其他對象依賴於具有條件的對象

public class Action{ 
    List<Item> targets; 
    List<Item> tools; 
    Condition condition; 
    ... 
} 

我的問題是,如果我在我的XML定義模式的複雜類型和擴展它們:

<xs:element name="Condition"> 
</xs:element> 

<xs:element name="StateCondition"> 
    <xs:complexContent> 
     <xs:extension base="Condition"> 
     <xs:sequence> 
      <xs:element ref="Item" /> 
      <xs:element name="ATTRIB" type="AttributeType" /> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:element> 

<xs:element name="AndCondition"> 
    <xs:complexContent> 
     <xs:extension base="Condition"> 
     <xs:sequence> 
      <xs:element ref="Condition" minOccurs="1" maxOccurs="unbounded" /> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:element> 

<xs:element name="Item"> 
    <xs:sequence> 
     <xs:element name="TARGETS"> 
     <xs:element ref="Item" minOccurs="0" maxOccurs="unbounded /> 
     </xs:element> 
     <xs:element name="TOOLS"> 
     <xs:element ref="Item" minOccurs="0" maxOccurs="unbounded /> 
     </xs:element> 
     <xs:element ref="Condition" /> 
    </xs:sequence> 
</xs:element> 

我將實現同一類的想法?我的意思是,如果我創建一個擁有一個AndCondition的XML文件,它會滿足驗證器嗎?

回答

1

我在閱讀後自己找到答案。希望這個問題會用於其他人。要讀取的資源是here,它定義了JAXB如何處理XML模式定義中的擴展基本類型。

簡而言之,是的,JAXB在模式中將擴展視爲Java中的繼承。

0

xs:extension的基本屬性必須引用一個類型。這是一種內置類型,您使用名稱定義的簡單類型,或者使用名稱定義的複雜類型。因此,您可以在示例中定義與您的元素相對應的類型(ConditionType,StateConditionType等),並將它們應用於您的命名屬性。然後在您的基礎架構中,您可以定義一個xs:choice以確保至少選擇一個您定義的元素。