接上一篇写 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@H_404_37@ xmlns:xs@H_404_37@="http://www.w3.org/2001/XMLSchema"@H_404_37@ elementFormDefault@H_404_37@="qualified"@H_404_37@ attributeFormDefault@H_404_37@="unqualified"@H_404_37@>@H_404_37@
<!-- 这里只声明了一个"猫"元素,而且类型是 simpleType,假定只有1到5只猫 -->@H_404_37@
<xs:element@H_404_37@ name@H_404_37@="cat"@H_404_37@>@H_404_37@
<xs:simpleType@H_404_37@>@H_404_37@
<xs:restriction@H_404_37@ base@H_404_37@="xs:integer"@H_404_37@>@H_404_37@
<xs:minInclusive="1"@H_404_37@/>@H_404_37@
<xs:minInclusive="5"@H_404_37@/>@H_404_37@
</xs:restriction@H_404_37@>@H_404_37@
</xs:simpleType@H_404_37@>@H_404_37@
</xs:element@H_404_37@>@H_404_37@
</xs:schema@H_404_37@>@H_404_37@
这里元素的类型,如果是 simpleType
,那么 restriction base
的值会是一个字符串,可以是 w3.org 的 schemas 中指定的数据类型,比如 xs:integer
, xs:string
, xs:token
等; restriction base
的值也可以是当前或者其他某个 schema
中,类型为 simpleType
的元素的名称;如果元素的类型是 complexType
,那么这个元素必须带有一个叫 sequence
的下级元素,再在 sequence
中包含一个或以上的元素
<xs:schema@H_404_37@ xmlns:xs@H_404_37@="http://www.w3.org/2001/XMLSchema"@H_404_37@ elementFormDefault@H_404_37@="qualified"@H_404_37@ attributeFormDefault@H_404_37@="unqualified"@H_404_37@>@H_404_37@
<!-- 这里的"猫"元素,类型改为 complexType,而且包含了多个元素 -->@H_404_37@
<xs:element@H_404_37@ name@H_404_37@="cat"@H_404_37@>@H_404_37@
<xs:complexType@H_404_37@>@H_404_37@
<xs:sequence@H_404_37@>@H_404_37@
<!-- 猫的眼睛个数,是一个 simpleType 的元素 -->@H_404_37@
<xs:element@H_404_37@ name@H_404_37@="countOfEyes"@H_404_37@ value@H_404_37@="2"@H_404_37@ type@H_404_37@="xs:int"@H_404_37@/>@H_404_37@
<!-- 猫的叫声,被定义成一个 complexType 的元素, 使用了 Sound 元素的自定义 soundsLike 属性 -->@H_404_37@
<xs:element@H_404_37@ name@H_404_37@="mySound"@H_404_37@ soundsLike@H_404_37@="meow"@H_404_37@ type@H_404_37@="Sound"@H_404_37@/>@H_404_37@
</xs:sequence@H_404_37@>@H_404_37@
</xs:complexType@H_404_37@>@H_404_37@
</xs:element@H_404_37@>@H_404_37@
<!-- 这里定义了声音的元素本体 -->@H_404_37@
<xs:element@H_404_37@ name@H_404_37@="Sound"@H_404_37@>@H_404_37@
<xs:complexType@H_404_37@>@H_404_37@
<xs:sequence@H_404_37@>@H_404_37@
</xs:sequence@H_404_37@>@H_404_37@
<!-- 猫叫声的自定义 soundsLike 属性, 就是来自 Sound 元素内部的 soundsLike 属性 -->@H_404_37@
<xs:attribute@H_404_37@ name@H_404_37@="soundsLike"@H_404_37@ type@H_404_37@="xs:string"@H_404_37@/>@H_404_37@
</xs:complexType@H_404_37@>@H_404_37@
</xs:element@H_404_37@>@H_404_37@
</xs:schema@H_404_37@>@H_404_37@
顺带补充一句,写 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 和站内相关的其他内容较好