我正在开发一个模式文件,我打算将它与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文件,它是否满足验证器?
答案 0 :(得分:2)
经过一番阅读后,我自己找到了答案。希望这个问题能够用于其他人。要读取的资源是here,它定义了JAXB如何处理XML模式定义中的扩展基类型。
简而言之,是的,JAXB将模式中的扩展视为Java中的继承。
答案 1 :(得分:0)
xs:extension的基本属性必须引用一个类型。这是一个内置类型,您使用名称定义的简单类型,或使用名称定义的复杂类型。因此,您可以定义与示例中的元素对应的类型(ConditionType,StateConditionType等),并将它们应用于您的命名属性。然后在基础架构中,您可以定义xs:choice以确保至少选择一个您定义的元素。