我有一个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>
这样我就可以在我的架构中定义类型限制。但是,如果我有数百种不同的属性,将来可能会增长,会发生什么......?
谢谢。
答案 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在描述数据结构方面是公平的,但在实际验证内容方面却不太好。