目录
- 前言
- Schema
- book.xsd文档解析
- < schema > 元素
- 简单的类型
- XSD 简易元素
- XSD 属性
- XSD 限定 / Facets
- XSD复合元素
- 不懂请看例题
- book.xml文档解析
- 总结
前言
|ू・ω・` )
首先,本章节主要是在【XML之DTD】之后写的一个跟DTD可以替换来用的XML schema
因为DTD虽然可以解决目前的小的问题,可DTD相对Schema来说还是有点力有不足
为了让大家学会能学会Schema,我也去查阅了许多的资料。
在本章中我会将一个xsd实列来讲个大家听,并且简单分析,然后给大家看如何使用xsd约束xml文件
废话不多说,lego
Schema
立场:W3C于2001年5月正式推荐XML Schema为XML 的标准模式,W3C希望以XML Schema来作为XML模式描述语言的主流,并逐渐代替XML DTD。
ps:(W3c)万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构
概念:
- XML是一种可扩展标记语言,用于标记电子文件使其具有结构性的标记语言
- 可以用来标记数据、定义数据类型
- 是一种允许用户对自己的标记语言进行定义的源语言
- 可扩展标记语言是标准通用标记语言的子集,非常适合 Web 传输。
为了大家理解:
book.xsd文档解析
我会讲个xsd文档的组成,然后如何运用xml文件来限制。
< schema > 元素
元素是每一个 XML Schema 的根元素
<?xml version="1.0"?>
<xs:schema>
...
...
</xs:schema>
< shema >有自己的属性:
上面有详细注释;可以看看理解
不懂我再来:
xmlns:xs="http://www.w3.org/2001/XMLSchema"
显示 schema 中用到的元素和数据类型来自命名空间 “http://www.w3.org/2001/XMLSchema”。同时它还规定了来自命名空间 “http://www.w3.org/2001/XMLSchema” 的元素和数据类型应该使用前缀 xs:
targetNamespace="http://www.example.org/book"
schema 定义的元素 来自命名空间: “http://www.example.org/book”
xmlns="http://www.example.org/book"
若没有前缀的话就是默认命名空间
elementFormDefault="qualified"
schema 中声明过的元素必须被命名空间限定。
简单的类型
XSD 简易元素
什么是简易元素?
简易元素指那些仅包含文本的元素。它不会包含任何其他的元素或属性。
语法:
<xs:element name="xxx" type="yyy"/>//xs是命名的空间里取得
xxx 指元素的名称,yyy 指元素的数据类型
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
例如:
schema定义:
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
XML 元素:
<name>"aa"</name>
<age>28</age>
XSD 属性
概念:所有的属性均作为简易类型来声明。
!!!注意:简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型
定义属性的语法:
<xs:attribute name="xxx" type="yyy"/>
比如:
XML 元素:
<name lang="EN">Smith</name>
定义:
<xs:attribute name="lang" type="xs:string"/>
XSD 限定 / Facets
概念:限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。
限定就暂时就讲 :对一个值的限定 和 对一组值得限定
对一个值的限定:
下面的例子定义了带有一个限定且名为 “age” 的元素。age 的值不能低于 0 或者高于 120:
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
对一组值得限定:
下面的例子定义了带有一个限定的名为 “car” 的元素。可接受的值只有:a, b c:
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="a"/>
<xs:enumeration value="b"/>
<xs:enumeration value="c"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
XSD复合元素
复合元素指包含其他元素及/或属性的 XML 元素。
有四种类型的复合元素:
- 空元素
复合元素,“product”,是空的
<product pid="1345"/>
- 包含其他元素的元素
复合元素,“employee”,仅包含其他元素:
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
- 仅包含文本的元素
复合元素,“food”,仅包含文本:
<food type="dessert">Ice cream</food>
- 包含元素和文本的元素
复合元素,“description”,包含元素和文本:
<description>
It happened on <date lang="norwegian">03.03.99</date> ....
</description>
如何定义:
不懂请看例题
写了一个简单的xsd限制,当然去参考了其他博主的代码
book.xml文档解析
上面已经有了个book.xsd文件来约束xml所以细微讲解一下,如何使用book.xsd文件
http://www.w3.org/2001/XMLSchema-instance 是一个固定值,这个URI指向一个xsd文档,该xsd的targetNamespace的值就是这个URI。
xsi:schemaLocation的作用:
其语法是:schemaLocation=“{namespaceURI} {xsd名称}”
只要与约束的一样就不会有什么问题
当然也可以在xmlns后加命名空间的前缀,在该前缀修饰的元素需要遵循该schema的规范。
总结
在我看来:XML Schema比XML DTD具有更强的表现力,特别是一些复杂的构造更加的好用些。
其他大触:ML Schema虽然在大多数的应用领域都有替代XML DTD的趋势,但是XML DTD仍然有它的适用范围,并不可能被XML Schema完全替代
Thanks♪(・ω・)ノ希望大家能用来参考