admin 管理员组

文章数量: 1087747

【Schema详解】

目录

  • 前言
    • 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 传输。

为了大家理解:

book.xsd文档解析

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

< schema > 元素

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

<?xml version="1.0"?><xs:schema>...
...</xs:schema>

< shema >有自己的属性:

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


不懂我再来:

xmlns:xs=""

显示 schema 中用到的元素和数据类型来自命名空间 “”。同时它还规定了来自命名空间 “” 的元素和数据类型应该使用前缀 xs:

targetNamespace=""

schema 定义的元素 来自命名空间: “”

xmlns=""

若没有前缀的话就是默认命名空间

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文件

是一个固定值,这个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♪(・ω・)ノ希望大家能用来参考

本文标签: Schema详解