XML Schema全接触

2016-02-19 12:48 9 1 收藏

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

【 tulaoshi.com - Web开发 】

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

XML定义语言:DTD,XDR和XSD

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

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

文档类型定义(DTD)

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

·  DTD使得XML文档保持一致

·  DTD可以共享

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

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

Schema

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

·  Schema使用的是XML语法

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

·  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编辑工具的支持。

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

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

 

来源:https://www.tulaoshi.com/n/20160219/1602018.html

延伸阅读
标签: 电脑入门
电脑是由硬件和软件组成的,缺了任何一样都无法运行。我们对电脑进行操作,都是利用操作系统来完成。最初的电脑没有操作系统,人们通过各种操作按钮来控制计算机,后来出现了汇编语言,并将它的编译器内置到电脑中,操作人员通过有孔的纸带将程序输入电脑进行编译。这些将语言内置的电脑只能由操作人员自己编写程序来运行,不利于设备、程序的...
标签: windows 操作系统
对于Windows XP来说,由于其采用了安全性能较高的NT内核,系统运行还算稳定,除了关机速度较慢之外,一般情况下很少发生关机故障。但下述一些故障现象您还应予以关注。 让它关机却重启 该故障是Windows XP操作系统关机故障中最容易出现的故障。造成该故障的原因可能有以下几方面原因: 1.系统设置在添乱 ...
本专题旨在为广大共享上网用户提供可选方案和技术上的支持。由于宽带上网的形式和方法多种多样,本专题不可能涵盖所有的技术方案,但相关的方法可作为参考和借鉴。随着共享上网限制措施的不断发展,共享上网仍然会是一个长远的话题,我们有必要了解一下它的原理和基本实现方法。 共享上网原理与方法概述 一、局域网共享上网原...
标签: Web开发
命名冲突   我们现在已经讨论了如何定义新的复合类型(比如PurchaseOrderType)、声明元素(比如purchaseOrder)和声明属性(如orderDate)。在这些定义行为中,一般都包含着命名,如果我们给两个对象赋予同样的名称会有何种结果? 答案取决于问题中的两个对象,一般来说这两个对象越相近,它们越有可能引起冲突。   下面,我们给出一些例...
标签: Web开发
复合类型定义、元素和属性声明   在XML Schema中,对于那些允许元素有自己的内容,以及可以携带自身属性的复合类型与那些不能够有元素内容和属性的简单类型,它们的表示形式有着本质的不同。在实例文档中,对于能建立新的类型(无论简单和复杂)的定义和允许元素和属性有特定的名字和类型(无论是简单还是复杂)的声明,它们之间也有着显著的...

经验教程

815

收藏

40

精华推荐

JBuilder 2005开发Applet游戏全接触

JBuilder 2005开发Applet游戏全接触

色彩渔生

WAP建站语言WML语法全接触

WAP建站语言WML语法全接触

钢琴前的诗人

早产儿家庭护理全接触

早产儿家庭护理全接触

纯天然土蜂蜜7

微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部