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>
有人可以帮我识别代码中的任何错误吗?并告诉我如何在id
和0
之间验证50
字段?
非常感谢, 标记
另外,只是一个随机的问题,当没有任何名称冲突时,是否有人知道使用 xml命名空间的优势?它是否与重用命名空间有关?
答案 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">
minOccurs
和maxOccurs
的默认始终为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>