xsd枚举中的预定义属性/常量

时间:2013-09-27 10:51:34

标签: attributes xsd constants enumeration

我有以下xml:

<animals>
   <animal name="Pongo" animalType="Dog" />
   <animal name="Marie" animalType="Cat" />
   <animal name="Skippy" animalType="Kangaroo" />
</animals>

我知道可以使用这样的枚举来限制动物的类型:

<xs:simpleType name="animalType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Cat" />
        <xs:enumeration value="Dog" />
        <xs:enumeration value="Kangaroo" />
    </xs:restriction>
</xs:simpleType>

我想要的是在xml解析后根据animalType值自动了解动物需要多少鞋。
并且,当添加新动物类型时,还要添加该动物的行走腿数 例如,可以定义像

这样的东西
<xs:simpleType name="animalType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Cat" nbOfShoes="4" />
        <xs:enumeration value="Dog" nbOfShoes="4" />
        <xs:enumeration value="Kangaroo" nbOfShoes="2" />
    </xs:restriction>
</xs:simpleType>

是否可以使用xsd实现这一点,或者我必须在解析xml后实现numberOfShoes逻辑?
谢谢。

1 个答案:

答案 0 :(得分:1)

这取决于。在XSD中,您可以从结构的角度定义xml。在XSD 1.0中,结构和内容之间的关系更难以表达。

您可以使用xsi:type属性替换类型。 XSD看起来像

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

    <!-- Let be Animals root element -->
    <xs:element name="Animals" type="animals" />

    <!-- type for Animals elemes -->
    <xs:complexType name="animals">
        <xs:sequence>
            <xs:element name="Animal" maxOccurs="unbounded"  type="animal"/>
        </xs:sequence>
    </xs:complexType>

    <!-- Define an abstract type for animal (abstract = there shouldn't occure element of this type only of its childs). It has no attributes. -->
    <xs:complexType name="animal" abstract="true">
        <xs:simpleContent>
            <xs:extension base="xs:string"/>
        </xs:simpleContent>
    </xs:complexType>

    <!-- Define a type for cat... -->
    <xs:complexType name="catType">
        <xs:simpleContent>
            <!-- ... it extends abstract animal type ... -->
            <xs:extension base="animal">
                <!-- ... and add some attributes with fixed values -->
                <xs:attribute name="name" fixed="cat" />
                <xs:attribute name="nbOfLegs" fixed="4" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <!-- similar definition like catType -->
    <xs:complexType name="kangarooType">
        <xs:simpleContent>
            <xs:extension base="animal">
                <xs:attribute name="name" fixed="kangaroo" />
                <xs:attribute name="nbOfLegs" fixed="2" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

</xs:schema>

以下XML应验证

<?xml version="1.0" encoding="UTF-8"?>
<Animals xsi:noNamespaceSchemaLocation="animals.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <!-- xsi:type is saying what type is actually used -->
    <Animal xsi:type="catType" name="cat" nbOfLegs="4" />
    <Animal xsi:type="kangarooType" name="kangaroo" nbOfLegs="2" />
</Animals>

以下不是

<?xml version="1.0" encoding="UTF-8"?>
<Animals xsi:noNamespaceSchemaLocation="animals.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Animal xsi:type="catType" name="cat" nbOfLegs="2" />
</Animals>

(错误如属性'nbOfLegs'的值'2'不等于固定的默认值'4')。