1

我有以下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 逻辑?
谢谢你。

4

1 回答 1

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')。

于 2013-09-27T13:26:29.320 回答