XML Schema全接触

奋斗小厨

奋斗小厨

2016-02-19 12:48

图老师小编精心整理的XML Schema全接触希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

2001年5月2日,经过三年多的发展,XML 的Schema终成正果。这样,XML、XML Schema和Namespace都成为了W3C的正式标准,这是一个值得庆贺的历史性时刻,意味着XML语法规范已经奠定了扎实的基础。中国XML联盟于第一时刻为你介绍最新的XML Schema标准和其在MSXML 4.0中的应用。

XML定义语言:DTD,XDR和XSD

我们知道XML文档有格式良好和有效性两种约束。格式良好适合于所有的XML文档,即满足XML标准中对于格式的规定。而当XML文档满足一定的语义约束则称该XML文档为有效的XML文档。目前常用的XML定义语言有DTD,XDR和XSD。

文档类型定义(DTD)

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

文档类型定义用不同于XML的独立语法来规定了XML文档中各种元素集合的内容模式。该语言直接沿袭了定义SGML语言的方法。

·  DTD使得XML文档保持一致

·  DTD可以共享

·  DTD提供了对XML语汇的形式化和完整的定义

·  每个XML文档有单个的DTD来限制

Schema

类似DTD,Schema可以规定一套特定文档的结构或模型。使用Schema语言来描述文档结构有下面以下好处:

·  Schema使用的是XML语法

·  Schema可以用XML解析器来解析

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

·  Schema允许全局性元素(在整个XML文档中元素用相同方式来使用)和局部性元素(元素在特定的上下文中有不同的含义)

·  Schema提供丰富的数据类型(如整型、布尔型、日期类型等);而且一个元素中的数据类型可以进行规定,甚至可以根据需要自定义数据类型

XDR

XDR的全称是XML-Data Reduced Language,是早先由XML-Data草案派生出来的一个定义XML语言的分支。由于微软最先提出了XML-Data,并且经过修订后在其软件中应用,所以XDR也被广泛使用。目前支持XDR Schema的产品有:

·  Microsoft Biztalk Server

·  Microsoft SQL Server 2000

·  Microsoft Office 2000

·  Microsoft IE5.0和后续版本

XDR也得到了Extensibility的 XML Authority编辑工具的支持。

XSD Schema

最为正式的XML Schema语言是由W3C指定的XML Schema规范,简称为XSD(XML Schema Definition)。XSD也提供了数据类型的支持和结构定义的方法。

2001年5月2日,XML Schema 规范成为了W3C的正式推荐标准。这就意味着经过三年多的发展,XML 的Schema标准终于修成了正果。这样,XML、XML Schema和Namespace都成为了W3C的正式,这是一个值得庆贺的历史性时刻,意味着XML语法的规范已经奠定了扎实的基础。XML的广泛发展和应用也即将成为现实。下面我们就将重点来介绍最新的XML Schema标准。

XML Schema的全貌

我们用实际的例子来介绍XML Schema的用法。比如,有这样的XML实例文档:
?xml version="1.0" encoding="GB2312"?
!DOCTYPE studentlst SYSTEM "student.dtd"
studentlst
student
name至尊宝/name
genda男/genda
sid001/sid
birthday1576-3-2/birthday
/student
student
name白晶晶/name
genda女/genda
sid002/sid
birthday1578-4-25/birthday
/studen

t
/studentlst
该文档用DTD定义如下:
?xml version="1.0" encoding="UTF-8"?
!ELEMENT studentlst (student)*
!ELEMENT student (name, genda, sid, birthday)
!ELEMENT name (#PCDATA)
!ELEMENT genda (#PCDATA)
!ELEMENT sid (#PCDATA)
!ELEMENT birthday (#PCDATA)

但是其中name和genda、sid等文本元素的数据类型都是统一的字符类型,而事实上我们一般要求对它们有更为严格的限制。比如,要求name仍然为字符类型,而genda为可选的枚举类型,只能取男或女,sid要求是三位的整数类型,并且要求birthday为日期类型。name和birthday的定义比较简单:
element name="name" type="string" minOccurs="1" maxOccurs="1/"
element name="birthday" type="date" minOccurs="1" maxOccurs="1/"
其中string和date类型都是Schema中自带的基本数据类型(Primary Data Type)。minOccurs和maxOccurs是最少和最多出现次数,这里是表示有而且只出现一次。这是最简单的元素声明。在XML Schema中提供两种数据类型:一是我们刚刚接触的基本数据类型或者称为内建数据类型;另外一种是扩展的数据类型,既在基本数据类型基础上用户自己扩展的数据类型。Schema中没有规定性别的类型,也没有直接规定三位整数的数据类型,但是性别是有男、女两种选择的枚举类型;而sid的每位都是非负整数,于是我们可以先定义两类扩展数据类型,然后来限制genda和sid元素。
simpleType name="GendaType"
restriction base="string"
enumeration value="男"/
enumeration value="女"/
/restriction
/simpleType
simpleType name="SIDType"
restriction base="string"
length value="3"/
pattern value="d{3}"/
/restriction
/simpleType

在定义扩展数据类型时是描述了一个simpleType元素,name属性是该数据类型的名称,数据类型由restriction子元素进行约束,该元素中的base属性是基类型,即它要扩展的基本数据类型。在枚举类型中在restriction的子元素中罗列初可选的数值;而在第二种情况时,通过对各方面(facet)进行规定来定义数据类型,比如length规定该数据类型总共有多少位数,而pattern则通过正则表达式来规定出现的方式。这里的意思是连续出现三位的整数。
用上面定义的数据类型来约束genda和sid的方法和name和birthday元素的声明相同:
element name="genda" type="GendaType" minOccurs="1" maxOccurs="1"/
element name="sid" type="SIDType" minOccurs="1" maxOccurs="1"/
有了最基本的四个文本内容的元素,如何定义作为其父元素的student元素呢?由于student元素是由子元素组成的,在Schema中称它位复杂类型的元素。而且其子元素是顺序组成的序列,因此这样声明student元素:
element name="student"
complexType
sequence
element name="name" type="string" minOccurs="1" maxOccurs="1"/
element name="genda" type="GendaType" minOccurs="1" maxOccurs="1"/
element name="sid" type="SIDType" minOccurs="1" maxOccurs="1"/
element name="birthday" type="date" minOccurs="1" maxOccurs="1"/
/sequence
/complexType
/element
另外,studentlst元素包含了student元素,并且出现的方式是一个或者多个,或者可以不出现,在Schema中出现的方式可以用miOccurs和maxOccurs来表达:
element name="studentlst"
complexType
sequence
element name="student" minOccurs="0" maxOccurs="unbounded"
complexType
sequence
element name="name" type="string" minOccurs="1" maxOccurs="1"/
element name="genda" type="GendaType" minOccurs="1" maxOccurs="1"/
element name="sid" type="SIDType" minOccurs="1" maxOccurs="1"/
element name="birthday" type="date" minOccurs="1" maxOccurs="1"/
/sequence&

gt;
/complexType
/element
/sequence
/complexType
/element
最后我们将这些元素和数据类型的声明都包含在schema根元素中:
?xml version="1.0"?
schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sl="http://www.xml.org.cn/namespaces/StudentList" targetNamespace="http://www.xml.org.cn/namespaces/StudentList"
element name="studentlst"
complexType
sequence
element name="student" minOccurs="0" maxOccurs="unbounded"
complexType
sequence
element name="name" type="string" minOccurs="1" maxOccurs="1"/
element name="genda" type="sl:GendaType" minOccurs="1" maxOccurs="1"/
element name="sid" type="sl:SIDType" minOccurs="1" maxOccurs="1"/
element name="birthday" type="date" minOccurs="1" maxOccurs="1"/
/sequence
/complexType
/element
/sequence
/complexType
/element
simpleType name="GendaType"
restriction base="string"
enumeration value="男"/
enumeration value="女"/
/restriction
/simpleType
simpleType name="SIDType"
restriction base="string"
length value="3"/
pattern value="{3}"/
/restriction
/simpleType
/schema

用XSD校验XML

由了XML Schema,你可以用来校验XML文档的语义和结构。在MSXML 4.0技术预览版本已经提供了用XSD Schema来校验XML文档的功能。在校验文档时,将schema添加到XMLSchemaCache对象中,设置其 object, set the schemas property of a DOMDocument对象的schemas属性引用XMLSchemaCache对象中的schema。在将XML文档载入到DOMDocument对象中时将自动执行校验操作。我们不妨用例子来说明如何在Visual Basic中通过编程实现XML文档校验。其中包括:
books.xsd
用来校验books.xml文件的Schema
books.xml
该文件将被载入并且和books.xsd对照校验
Visual Basic校验代码
创建一个XMLSchemaCache对象,将schema添加给它,然后设置schemas property of the DOMDocument对象的shemas属性。在开始的时候你要进行如下操作:
打开Visual Basic 6.0,选择Standard EXE新项目
在Project菜单中选择References.
在Available References列表中选择Microsoft XML,v4.0
给Form1添加一个Command button
存储该项目
books.xml
在XML编辑器甚至一般的文本编辑器中输入以下XML代码,并且存为books.xml:
?xml version="1.0"?
x:catalog xmlns:x="urn:books"
book id="bk101"
authorGambardella, Matthew/author
titleXML Developer's Guide/title
genreComputer/genre
price44.95/price
publish_date2000-10-01/publish_date
descriptionAn in-depth look at creating applications with XML./description
title2000-10-01/title
/book
/x:catalog
books.xsd
下面是本例中使用的books.xsd schema。
xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xsd:element name="catalog" type="CatalogData"/
xsd:complexType name="CatalogData"
xsd:sequence
xsd:element name="book

" type="bookdata" minOccurs="0" maxOccurs="unbounded"/
/xsd:sequence
/xsd:complexType
xsd:complexType name="bookdata"
xsd:sequence
xsd:element name="author" type="xsd:string"/
xsd:element name="title" type="xsd:string"/
xsd:element name="genre" type="xsd:string"/
xsd:element name="price" type="xsd:float"/
xsd:element name="publish_date" type="xsd:date"/
xsd:element name="description" type="xsd:string"/
/xsd:sequence
xsd:attribute name="id" type="xsd:string"/
/xsd:complexType
/xsd:schema
Visual Basic校验代码
你可以运行下面的例子:
拷贝下面的代码到Command1_Click过程中
Private Sub Command1_Click()
Dim xmlschema As MSXML2.XMLSchemaCache
Set xmlschema = New MSXML2.XMLSchemaCache
xmlschema.Add "urn:books", App.Path & "books.xsd"
Dim xmldom As MSXML2.DOMDocument
Set xmldom = New MSXML2.DOMDocument
Set xmldom.schemas = xmlschema
xmldom.async = False
xmldom.Load App.Path & "books.xml"
If xmldom.parseError.errorCode 0 Then
MsgBox xmldom.parseError.errorCode & " " & xmldom.parseError.reason
Else
MsgBox "No Error"
End If
End Sub
执行该程序,然后点击Command1按钮,将返回"No Errors"消息框

XML Schema和名域

Schema是一些规则的集合(也称为语法或者语汇),其中包括了类型定义(简单和复杂类型)以及元素和属性声明。由于XML中可能存在不同的语汇来描述不同的元素和属性,因此需要使用名域(namespace)和前缀来避免元素和属性声明之间的模糊性。当你使用来自多个名域的schema时,分清元素和属性名称是最基础性的工作。
一个名域通常有一串字符串来相互区别,如 "urn:www.microsoft.com", "http://www.xml.org.cn", "http://www.w3c.org/2001/XMLSchema"以及 "uuid:1234567890"等。
XML Schema的序言
XML schema的开头时是一些导言,之后才是正式的声明。在schema 元素的导言中可能包含三个可选的属性。
例如,下面的语法使用的schema元素引用了三个最常使用的名域:
schema
xmlns="http://www.w3c.org/2001/XMLSchema" xmlns:xsd="http://www.w3c.org/2001/XMLSchema-datatypes" xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instances"
version"1.0"
/schema
前两个属性用XML名域来标识W3C中的两个XML schema规范。第一个 xmlns属性包含了基本的XML schema元素,比如element, attribute, complexType, group, simpleType等。第二个xmlns属性定义了标准的XML schema属性类型例如string, float, integer, 等。
缺省名域
对于任何一个XML Schema定义文档(XSD)都有一个最顶层的schema (XSD)元素。而且该schema (XSD)元素定义必须包含下面的名域:
http://www.w3.org/2001/XMLSchema
作为名域的标识符(在声明中作为元素或属性的前缀),你也可以不使用xsd或xsi。
我们分别来观察XSD和XML实例文档中相关的名域。比如前面介绍student.xsd的序言是这样的:
schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sl="http://www.xml.org.cn/namespaces/StudentList" targetNamespace="http://www.xml.org.cn/namespaces/StudentList"
这里的targetNamespace属性表示了该shema所对应的名域的URI。也就是说在引用该Schema的其它文档中要声明名域,其URI应该是targetNamespace的属性值。例如在这里因为要用到student.xsd自己定义的扩展数据类型,所以也声明的名域xmlns:sl="http://www.xml.org.cn/namespaces/StudentList"。
我们再来看由该schema规定的XML文档的开头将是什么样子:
studentlst xmlns="http://www.xml.org.cn/namespaces/StudentList"
xmlns:xsi="http://www

.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.xml.org.cn/namespaces/StudentList student.xsd"
其中缺省名域声明xmlns="http://www.xml.org.cn/namespaces/StudentList"就是和刚刚声明的XML Schema的名域相结合来规定该XML文档。xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 是任何XML实例文档固有的名域,当然按照前面所说的名域名称xsi是可以自己规定的。而xsi:schemaLocation="http://www.xml.org.cn/namespaces/StudentList student.xsd"则规定了该名域所对象的schema的位置,即在相同路径的student.xsd文件。

 

展开更多 50%)
分享

猜你喜欢

XML Schema全接触

Web开发
XML Schema全接触

XML Schema用法

Web开发
XML Schema用法

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Photoshop 6.0 全接触

PS PS教程
Photoshop 6.0 全接触

托盘编程全接触

C语言教程 C语言函数
托盘编程全接触

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

WindowsXP关机故障全接触

windows 操作系统
WindowsXP关机故障全接触

WinXP:关机故障全接触

windows 操作系统
WinXP:关机故障全接触

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

HTML标记语言——引用

HTML标记语言——引用

莪想要旳迩不会懂 - QQ情侣分组

莪想要旳迩不会懂 - QQ情侣分组
下拉加载更多内容 ↓