类型替换的XML模式

时间:2012-11-25 07:33:37

标签: xml schema

我有一个类似下面的XML文件,并希望使用类型替换方法创建XML模式,以便它可以验证以下XML文件。但是我创建的模式是完全错误的。请告诉我如何编码模式以验证下面的文件XML。

详细说明:

  • 只存放两种动物,一只是鸟,一只是鱼。
  • 对于类型,名称和原始元素都是必需的
  • 对于类型:bird,可以选择存储其他颜色元素。
  • 对于type:fish,需要存储额外的size元素

    <animals>
     <animal animalID="b-1" xsi:type="bird">
         <name>Humming Bird</name>
         <origin>Asia</origin>
         <color>Blue</color>
     </animal> 
     <animal animalID="b-2" xsi:type="bird">
         <name>Horn Bill</name>
         <origin>Asia</origin>
     </animal>
     <animal animalID="f-2" xsi:type="fish">
         <name>Whale</name>
         <origin>Europe</origin>
         <size>Large</size>
     </animal>
     <animal animalID="b-5" xsi:type="bird">
         <name>Parrot</name>
         <origin>Europe</origin>
     </animal>
    

我已经推出了以下架构,我认为这是完全错误的。

 <xsd:element name="bird" substitutionGroup="animals" 
         type="birdType"/>
 <xsd:element name="fish" substitutionGroup="animals" 
         type="fishType"/>
 <xsd:element name="animals">
<xsd:complexType>
    <xsd:sequence>
        <xsd:element name="animal" maxOccurs="unbounded"/>
    </xsd:sequence>
</xsd:complexType>
</xsd:element>

 <xsd:element name="animal">
<xsd:complexType>
    <xsd:sequence>
        <xsd:element ref="bird" maxOccurs="unbounded"/>
    </xsd:sequence>
</xsd:complexType>
</xsd:element>

2 个答案:

答案 0 :(得分:0)

我不是生物学家,但如果我是的话,我会和你的分类学争吵......

如果您使用xsi:type来区分这两种类型,那么架构需要包含名为“bird”和“fish”的全局复杂类型定义。您可以通过某种基类型的扩展来推导出这两者,比如“生物”(因为我们在这里没有做真正的生物学......)。类型生物包含两个公共元素名称和原点,两个扩展分别包含可选元素颜色和大小。动物元素被定义为“生物”类型。

答案 1 :(得分:0)

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
<xsd:complexType name="animalType">
    <xsd:sequence>
        <xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
        <xsd:element name="origin" type="xsd:string" minOccurs="1" maxOccurs="1"/>
    </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="birdType">
    <xsd:complexContent>
        <xsd:extension base="animalType">
            <xsd:sequence>
                <xsd:element name="color" type="xsd:string" minOccurs="0"/>
            </xsd:sequence>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="fishType">
    <xsd:complexContent>
        <xsd:extension base="animalType">
            <xsd:sequence>
                <xsd:element name="size" type="xsd:string" minOccurs="1"/>
            </xsd:sequence>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>
<xsd:element name="animals">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="animal" type="animalType" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
</xsd:schema>