【问题标题】:XSD : model properties (name/value pairs)XSD:模型属性(名称/值对)
【发布时间】:2009-07-20 20:03:08
【问题描述】:

我有一个 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>

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

谢谢。

【问题讨论】:

    标签: xml xsd schema


    【解决方案1】:

    推荐的方法是使用具有特定类型的特定属性或元素对 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>
    

    【讨论】:

      【解决方案2】:

      XML Schema 1.0 没有这些限制。

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

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

      另一种选择是使用Schematron

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

      【讨论】:

        【解决方案3】:

        我认为您不能通过属性名称来强制执行此操作。不过,您可能可以使用Schematron 做点什么。

        在冗长的严格模式与宽松的紧凑模式之间通常需要权衡取舍。您必须根据 XML 文件的用途以及 Xsd 的使用方式来决定哪种情况更好。

        【讨论】:

          【解决方案4】:

          XSD 中没有条件支持来做你想做的事。让解析器验证 XML 对您来说绝对重要吗?

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

          但是,通常情况下,验证是否发生在稍后阶段(例如,当您的 XML 被您的应用程序消化时)并不重要,此时您可以轻松地做您想做的事情。

          【讨论】:

            猜你喜欢
            • 2016-07-29
            • 2018-12-17
            • 2021-02-02
            • 2017-03-02
            • 2022-06-20
            • 1970-01-01
            • 2018-12-27
            • 2017-09-16
            • 1970-01-01
            相关资源
            最近更新 更多