我如何编写以下XML代码的模式? (限制值)

时间:2014-06-11 02:35:28

标签: xml namespaces xsd schema restriction

XML实例:

<scooters>
    <scooter id = "1">
        <name>Razer </name>
        <description> A powerful scooter </description>
    </scooter>
    <scooter id = "2">
        <name>Apex</name>
        <description> Another good scooter </description>
    </scooter>
</scooters>

XML架构元素声明:

<xsd:element name = "scooters">

    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name = "scooter">
                <xsd:complexType>

         <!-- How do I put validation on the above field considering that 
              it is a complexType (i think), and that it needs to be a number 
              between 0 and 50? -->

                    <xsd:sequence>
                        <xsd:element name = "name" type = "xsd:string" />
                        <xsd:element name = "description" />
                        <xsd:simpleType>
                            <xsd:restriction base = "xsd:string">
                                <xsd:enumeration value = "Great" />
                                <xsd:enumeration value = "Old" />
                            </xsd:restriction>
                        </xsd:simpleType>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>

</xsd:element>

有人可以帮我识别代码中的任何错误吗?并告诉我如何在id0之间验证50字段?

非常感谢, 标记

另外,只是一个随机的问题,当没有任何名称冲突时,是否有人知道使用 xml命名空间的优势?它是否与重用命名空间有关?

2 个答案:

答案 0 :(得分:0)

请使用此更正的XML架构:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="scooters">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="scooter" maxOccurs="50" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="name"/>
              <xs:element type="xs:string" name="description"/>
            </xs:sequence>
            <xs:attribute type="xs:byte" name="id" use="optional"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

请使用:< maxOccurs="unbounded" minOccurs="0">以验证最小值和最大值之间的字段

使用命名空间允许您进行导入和包含允许您在其他XML SCHEMA中重用XML SCHEMA的函数。 :)

请考虑查看这篇非常好的文章:XML 10 recommandations

告诉我一切都好。享受:)

答案 1 :(得分:0)

检查架构,有一些错误。例如,您不能将<xsd:simpleType>作为<xsd:sequence>的孩子。您可以将其设置为description的简单类型:

<xsd:element name = "description">
    <xsd:simpleType>
        <xsd:restriction base = "xsd:string">
            <xsd:enumeration value = "Great" />
            <xsd:enumeration value = "Old" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:element>

这将修复架构。但我不认为你会这么想。它不会验证您的XML实例,因为Great中只能使用值Old<description>

因此,我假设您的实例包含您要验证的数据,并根据它建议对XSD进行一些更改。

复杂类型基本上是一种类型,可能包含 groups 元素(序列,选项等)。如果您的类型是字符串或您可以表示为字符串的任何内容(例如数字,日期),那么您将使用简单类型。但是如果你有属性,那么你必须使用复杂类型。在这种情况下,您可以声明具有复杂类型但具有简单内容的元素。属性总是简单的类型。

在您的情况下,您有两个复杂类型的元素:<scooters><scooter>。两者都包含序列:

<xsd:element name = "scooters">
    <xsd:complexType>
        <xsd:sequence>
    ...

<xsd:element name = "scooter">
    <xsd:complexType>
        <xsd:sequence>
    ...

另外两个是使用 native XSD字符串类型的简单类型,并且是scooter中声明的序列的一部分。序列强制执行订单,因此您必须始终在name之前放置description

<xsd:sequence>
    <xsd:element name="name" type="xsd:string" />
    <xsd:element name="description" type="xsd:string"/>
</xsd:sequence>

您的scooters元素应该允许多个scooter个孩子。您可以添加maxOccurs="unbounded"属性以允许任意数量的子<scooter>元素:

<xsd:element name = "scooter" maxOccurs="unbounded">

minOccursmaxOccurs默认始终为1.您可以使用minOccurs="0"创建可选元素。

最后,<xsd:attribute>声明应显示为<xsd:complexType>和<{em> <xsd:sequence>之后的。如果您没有任何限制,可以简单地将其声明为xsd:integer

<xsd:attribute name="id" type="xsd:integer">

该整数限制为0到50之间的值,您需要添加<xsd:restriction>

<xsd:attribute name="id">
    <xsd:simpleType>
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="50"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:attribute>

这是您最终的XSD以及所有修复程序。它现在验证您的实例:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 

    <xsd:element name = "scooters">
        <xsd:complexType>
            <xsd:sequence>

                <xsd:element name = "scooter" maxOccurs="unbounded">
                    <xsd:complexType>

                        <xsd:sequence>
                            <xsd:element name="name" type="xsd:string" />
                            <xsd:element name="description" type="xsd:string"/>
                        </xsd:sequence>

                        <xsd:attribute name="id">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:integer">
                                    <xsd:minInclusive value="0"/>
                                    <xsd:maxInclusive value="50"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:attribute>

                    </xsd:complexType>
                </xsd:element>

            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

您还可以将某些类型和元素声明为<xsd:schema>的子元素。这可能是一种风格问题,但它也允许重用您的类型和元素(例如:您可能希望根据某些正则表达式定义一些限制某些属性的类型,并将其与其他元素一起重用)。这是您的架构,其中包含两个元素,您的属性类型为顶级结构。请注意,scooters声明使用ref元素来引用scooter声明。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 

    <xsd:element name = "scooters">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="scooter" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="scooter">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="name" type="xsd:string" />
                <xsd:element name="description" type="xsd:string"/>
            </xsd:sequence>
            <xsd:attribute name="id" type="IdType"/>
        </xsd:complexType>
    </xsd:element>

    <xsd:simpleType name="IdType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="50"/>
        </xsd:restriction>
    </xsd:simpleType>

</xsd:schema>