2013-09-16 62 views
0

我相信已经理解了this article中的所有内容,但似乎仍然有一些工作适合我。XML架构中的简单继承树

如果我在类的简单继承树:

A (abstract) 
^ 
B 
^ 
C 

而且我想在我的XML对象的简单列表,followes:

<mylist> 
    <B>lalala</B> 
    <C>fofofo</C> 
    <C>fofofo</C> 
    <C>fofofo</C> 
    <C>fofofo</C> 
    <B>lalala</B> 
</mylist> 

似乎不当我尝试验证此方案对:

<xs:schema> 
    <xs:complexType name="A" abstract="true"> 
     <xs:element name="text" type="xs:string"/> 
    </xs:complexType> 
    <xs:complexType name="B"> 
     <xs:complexContent> 
      <xs:extension base="A"/> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="C"> 
     <xs:complexContent> 
      <xs:extension base="B"/> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="mylist> 
     <xs:sequence maxOccurs="unbounded"> 
      <xs:element name="A" type="A"/> 
     </xs:sequence> 
    </xs:element> 
</xs:schema> 

请记住,这只是伪代码没有很多命名空间的短xml的缘故。

为什么一个验证器告诉我(记事本+ +为例),它仍然在期待一个<A>而不是<B><C>

回答

1

你越来越近了。但是你将元素名称与类型名称相混淆。类型B和C可以替代类型A,但是您尚未声明任何名为B和C的元素,更不用说声明它们并且使它们可以替换元素A.

以下XML实例对修正有效您的方案版本:

<mylist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="Mamix.xsd"> 
    <A xsi:type="B"><text>lalala</text></A> 
    <A xsi:type="C"><text>fofofo</text></A> 
    <A xsi:type="C"><text>fofofo</text></A> 
    <A xsi:type="C"><text>fofofo</text></A> 
    <A xsi:type="C"><text>fofofo</text></A> 
    <A xsi:type="B"><text>lalala</text></A> 
</mylist> 

如果你想允许元素B和C来代替,用适当的类型声明他们并指定他们是替代的元素A(必须是一个顶级元素为这是可能)。你的架构将是这样的:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="A" abstract="true"> 
     <xs:sequence> 
      <xs:element name="text" type="xs:string"/> 
     </xs:sequence>   
    </xs:complexType> 

    <xs:complexType name="B"> 
     <xs:complexContent> 
      <xs:extension base="A"/> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="C"> 
     <xs:complexContent> 
      <xs:extension base="B"/> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="A" type="A"/> 
    <xs:element name="B" type="B" substitutionGroup="A"/> 
    <xs:element name="C" type="C" substitutionGroup="A"/> 

    <xs:element name="mylist"> 
     <xs:complexType> 
      <xs:sequence maxOccurs="unbounded"> 
       <xs:element ref="A"/> 
      </xs:sequence>    
     </xs:complexType> 
    </xs:element> 

</xs:schema> 

根据该模式,下面的实例(通过添加“文本”元素的声明“A”,需要从原始的XML修改)是有效的:

<mylist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="Mamix.xsd"> 
    <B><text>lalala</text></B> 
    <C><text>fofofo</text></C> 
    <C><text>fofofo</text></C> 
    <C><text>fofofo</text></C> 
    <C><text>fofofo</text></C> 
    <B><text>lalala</text></B> 
</mylist>