接上一篇写 Yun UI 封装的例子,接下来要封装一下自己的常用控件了;上 w3schools.com 读了完整的教程,先从简单处入手:
文件开头必须声明 xml 版本和编码,通常就是
<?xml version="1.0" encoding="UTF-8" ?>
全部元素都需要被包覆在<xs:schema>
和</xs:schema>
之间,也就是<xs:schema>
必须在第一个元素的前面,而</xs:schema>
必须在最后一个元素的后面
当然,这里的 <xs:schema>
实际应该补充好引用的命名空间,也就是写成 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
,下一步就是元素的组装
遵照这个惯例,我们的全部元素和属性,都要以 xs:
来开头了;元素的类型可以是 complexType
,也可以是 simpleType
,一个元素的类型只能声明为 complexType
或者 simpleType
;比如写成这样的
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 这里只声明了一个"猫"元素,而且类型是 simpleType,假定只有1到5只猫 -->
<xs:element name="cat">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive="1"/>
<xs:minInclusive="5"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
这里元素的类型,如果是 simpleType
,那么 restriction base
的值会是一个字符串,可以是 w3.org 的 schemas 中指定的数据类型,比如 xs:integer
, xs:string
, xs:token
等; restriction base
的值也可以是当前或者其他某个 schema
中,类型为 simpleType
的元素的名称;如果元素的类型是 complexType
,那么这个元素必须带有一个叫 sequence
的下级元素,再在 sequence
中包含一个或以上的元素
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 这里的"猫"元素,类型改为 complexType,而且包含了多个元素 -->
<xs:element name="cat">
<xs:complexType>
<xs:sequence>
<!-- 猫的眼睛个数,是一个 simpleType 的元素 -->
<xs:element name="countOfEyes" value="2" type="xs:int"/>
<!-- 猫的叫声,被定义成一个 complexType 的元素, 使用了 Sound 元素的自定义 soundsLike 属性 -->
<xs:element name="mySound" soundsLike="meow" type="Sound"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- 这里定义了声音的元素本体 -->
<xs:element name="Sound">
<xs:complexType>
<xs:sequence>
</xs:sequence>
<!-- 猫叫声的自定义 soundsLike 属性, 就是来自 Sound 元素内部的 soundsLike 属性 -->
<xs:attribute name="soundsLike" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
顺带补充一句,写 schema
还是尽量按业界标准来吧,除去易于理解,还有这么多年的实践的教训,可以看看 https://msdn.microsoft.com/en-us/library/7f0tkwcx(v=vs.80).aspx 和 http://www.w3school.com.cn/schema/schema_elements_ref.asp ,告别瞎摸,从我做起(笑)
另,写这篇文章的用意,是出于校验的方法较常见、而通过“掌握”了规则的软件来设计 schema 的例子较少;如果想做这块,还是看 http://www.edankert.com/validate.html 和站内相关的其他内容较好