XML Schema Inheritance的工作方式与OOP继承的工作方式相同吗?

时间:2010-07-02 17:09:35

标签: java xsd jaxb

我正在开发一个模式文件,我打算将它与JAXB一起用于我的项目。在Java中,我有以下类型的代码结构

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){
      ...
   }
}

当然,我的代码中有其他对象依赖于具有Condition对象

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

我的问题是,如果我在XML Schema中定义一个complexType并扩展它们:

<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文件,它是否满足验证器?

2 个答案:

答案 0 :(得分:2)

经过一番阅读后,我自己找到了答案。希望这个问题能够用于其他人。要读取的资源是here,它定义了JAXB如何处理XML模式定义中的扩展基类型。

简而言之,是的,JAXB将模式中的扩展视为Java中的继承。

答案 1 :(得分:0)

xs:extension的基本属性必须引用一个类型。这是一个内置类型,您使用名称定义的简单类型,或使用名称定义的复杂类型。因此,您可以定义与示例中的元素对应的类型(ConditionType,StateConditionType等),并将它们应用于您的命名属性。然后在基础架构中,您可以定义xs:choice以确保至少选择一个您定义的元素。