XSD:模型属性(名称/值对)

时间:2009-07-19 22:20:54

标签: xml xsd schema

我有一个XML定义属性,如:

<properties>
    <property name="play_sound" value="true" />
    <property name="duration" value="30" />
</properties>

是否可以使用XML模式指定条件,例如“如果属性名称为'duration',则该值必须为整数”。我认为这是不可能的,在XML文件中建模这种信息的推荐方法是什么?

我一直在想类似的事情:

<properties>
    <play_sound>true</play_sound>
    <duration>30</duration>
</properties>

这样我就可以在我的架构中定义类型限制。但是,如果我有数百种不同的属性,将来可能会增长,会发生什么......?

谢谢。

4 个答案:

答案 0 :(得分:2)

推荐的方法是使用特定属性或具有特定类型的元素对XML进行建模。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="properties">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="play_sound" type="xs:boolean"/>
                <xs:element name="duration" type="xs:byte"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

<properties>
    <play_sound>true</play_sound>
    <duration>30</duration>
</properties>

答案 1 :(得分:1)

我认为您不能通过属性名称强制执行此操作。你可以用Schematron做一些事情。

在详细严格模式与宽松紧凑模式之间存在一般性权衡。根据XML文件的用途以及Xsd的使用方式,您必须根据自己的情况决定哪种方式更好。

答案 2 :(得分:1)

XSD中没有任何条件支持可以执行您想要的操作。解析器验证XML是否绝对至关重要?

如果是这样,您唯一的选择是将属性定义为类型(如您所述)或属性(例如<my_object play_sound="true" duration="30"/>

然而,通常,如果验证发生在稍后阶段(例如,当您的XML被应用程序消化时)并不重要,此时可以轻松地执行您想要的操作。

答案 3 :(得分:1)

XML Schema 1.0没有这些约束。

XML Schema 1.1,目前正在开发中。

如果您使用Saxon XSLT / XQuery引擎,则包含用于实验的XML Schema 1.1的早期实现。

另一种选择是使用Schematron

但通常,这些是在应用程序内部处理的。 XML Schema在描述数据结构方面是公平的,但在实际验证内容方面却不太好。