目录

  • 前言
  • 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技术领域最具权威和影响力的国际中立性技术标准机构

概念:

  1. XML是一种可扩展标记语言,用于标记电子文件使其具有结构性的标记语言
  2. 可以用来标记数据、定义数据类型
  3. 是一种允许用户对自己的标记语言进行定义的源语言
  4. 可扩展标记语言是标准通用标记语言的子集,非常适合 Web 传输。

为了大家理解:

schema 在线_xml

book.xsd文档解析

我会讲个xsd文档的组成,然后如何运用xml文件来限制。

< schema > 元素

元素是每一个 XML Schema 的根元素

<?xml version="1.0"?>

<xs:schema>

...
...

</xs:schema>

< shema >有自己的属性:

schema 在线_schema_02


上面有详细注释;可以看看理解


不懂我再来:

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>

如何定义:

schema 在线_schema 在线_03

不懂请看例题

写了一个简单的xsd限制,当然去参考了其他博主的代码

schema 在线_xml_04


book.xml文档解析

上面已经有了个book.xsd文件来约束xml所以细微讲解一下,如何使用book.xsd文件

schema 在线_xml_05

http://www.w3.org/2001/XMLSchema-instance 是一个固定值,这个URI指向一个xsd文档,该xsd的targetNamespace的值就是这个URI。

xsi:schemaLocation的作用:

其语法是:schemaLocation=“{namespaceURI} {xsd名称}”

schema 在线_schema 在线_06


只要与约束的一样就不会有什么问题

当然也可以在xmlns后加命名空间的前缀,在该前缀修饰的元素需要遵循该schema的规范。

schema 在线_XML_07


总结

在我看来:XML Schema比XML DTD具有更强的表现力,特别是一些复杂的构造更加的好用些。

其他大触:ML Schema虽然在大多数的应用领域都有替代XML DTD的趋势,但是XML DTD仍然有它的适用范围,并不可能被XML Schema完全替代

Thanks♪(・ω・)ノ希望大家能用来参考