XML学习笔记(三) -- Schema
标签(空格分隔): 学习笔记
Schema的格式
XML Schema文档是由元素、属性、命名空间和XML文档中的其他节点构成的。
XML Schema有两种重要的Schema模型:Microsoft XML Schema和W3C XML Schema。
例:
1)新建一个schema文件film.xsd
:
<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="电影">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="片名" type="xsd:string"/>
<xsd:element name="主演" type="xsd:string"/>
<xsd:element name="发行情况">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="发行国家" type="xsd:string"/>
<xsd:element name="发行日期" type="xsd:string"/>
<xsd:element name="拷贝数量" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
2)新建xml文件:film.xml
<?xml version="1.0" encoding="GB2312"?>
<电影 xmlns:xsi="http://wwww.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="film.xsd">
<片名>钢铁侠3</片名>
<主演>小罗伯特·唐尼</主演>
<发行情况>
<发行国家>美国</发行国家>
<发行日期>2013</发行日期>
<拷贝数量>1000</拷贝数量>
</发行情况>
</电影>
在XML Schema的基本结构中,XML Schema文件的根元素必须是schema,schema元素有一个属性xmlns,用于指定整个XML Schema位于http://www.w3.org/2001/XMLSchema名称空间中,名称空间的前缀是xsd。
schema根元素
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...<!--Schema的内容-->
</xsd:schema>
- xsd:schema -- 表示这是Schema文档的根元素;
- xmlns是用来声明名称空间的专用关键词,这里的名称空间http://www.w3.org/2001/XMLSchema被映射到xsd前缀 (名称空间的前缀可以使用任意的标识符,而不只局限于xsd)
element元素
XML Schema中的元素是利用element标识符来声明的,语法格式为:
<element bstract|block|default|final|fixed|form|id|maxOccurs|minOccurs|name|nillable|ref|substitutionGroup|type>
<annotation |simplrType|complexType|unique|key|keyref>
</element>
例如:
<xsd:element name="经理" type="xsd:string" maxOccurs="unbounded"/>
<xsd:element name="员工" type="xsd:string" maxOccurs="unbounded"/>
默认值和固定值
<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="newname" type="xsd:string"/>
<xsd:element name="type" type="xsd:string" default="sports"/>
<xsd:element name="date" type="xsd:integer" default="20161011"/>
<xsd:element name="count" type="xsd:integer" fixed="1"/>
</xsd:schema>
引用和代替元素
有时候,一个元素在XML文档中的不同位置上出现多次,如果在描述其结构的Schema文档中对于该元素的声明重复定义的话,会造成书写重复也不美观。-- 可以用元素引用来解决这个问题。
<xsd:element name="元素名称" ref="要引用的元素名称">
例子:
*** 使用ref属性实现元素的引用
新建一个schema文件
film.xsd
,声明一个“artist”属性,然后在“film”元素中进行引用:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="film">
xsd:complexType
xsd:sequence
<xsd:element name="name" type="xsd:string"/>
<xsd:element ref="artist"/>
</xsd:sequence>
</xsd:comlexType>
</xsd:element>
<xsd:element name="artist">
xsd:complexType
xsd:sequence
xsd:choice
<xsd:element name="starring" type="xsd:string"/>
<xsd:element name="director" type="xsd:string"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>新建xml文件
film.xml
,并与film.xsd
文件相关联:钢铁侠3
小罗伯特·唐尼
注意:在上例中,使用了
ref
属性引用了元素artist
的声明。
*** 使用ref属性实现元素组的替换
新建一个schema文件
film.xsd
:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="film">
xsd:complexType
xsd:sequence
<xsd:element name="name" type="xsd:string"/>
<xsd:element ref="director"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="director" type="xsd:string"/>
<xsd:element name="starring" type="xsd:string" sunstitutionGroup="director"/>
</xsd:schema>
- 解析:在声明
"starring"
时,使用substitutionGroup
元素与director
元素相关联,然后在film
元素中使用ref
元素进行引用。
2)新建一个xml文件film.xml
<?xml version="1.0" encoding="GB2312"?>
<film xmlns:xsi-http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation="film.xsd">
<name>钢铁侠3</name>
<starring>小罗伯特·唐尼</starring>
</film>
Schema属性声明
<xsd:attribute name="属性名" type="属性类型"/>
Schema自定义数据类型
1)film.xsd
<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="电影">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="片名" type="xsd:string"/>
<xsd:element name="主演" type="主演类型"/>
<xsd:element name="发行情况">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="编号" type="xsd:integer"/>
<xsd:element name="发行时间" type="xsd:string"/>
<xsd:element name="发行国家" type="xsd:string"/>
<xsd:element name="拷贝数量" type="数量类型"/>
</xsd:sequence>
<xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="主演类型">
<xsd:restriction base="xsd:string">
<xsd:minLength value="6"/>
<xsd:maxLength value="20"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="数量类型">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="1"/>
<xsd:maxInclusive value="10000"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
film.xml
<电影 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="film.xsd">
<片名>蝙蝠侠3</片名>
<主演>小罗伯特·唐尼</主演>
<发行情况>
<编号>1589874</编号>
<发行时间>2013</发行时间>
<发行国家>美国</发行国家>
<拷贝数量>5000</拷贝数量>
</发行情况>
</电影>
复杂类型:simpleContent 和 complexContent
复杂类型与简单类型的根本区别是:复杂类型的内容中可以包含其他元素或属性,而简单类型既不能包含子元素,也不能带有任何属性。
simpleContent
simpleContent是在简单类型的基础上通过增加属性派生而来的,成为扩展派生(extension).
<xsd:element name="元素名称" type="元素类型">
<xsd:complexType name="类型名">
<xsd:simpleContent>
<xsd:extension base="简单类型">
<xsd:attribute name="属性名1" type="属性类型"/>
<xsd:attribute name="属性名2" type="属性类型"/>
....
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
complexContent
complexContent元素是指元素中包含子元素,且包含属性的复杂元素。
<xsd:element="元素名称" type="元素类型">
<xsd:compexType name="类型名">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<!--子元素声明-->
<!--属性声明-->
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
其中,一个complexType元素通常会包含多个子元素。XML Schema提供了4种分组结构来指示子元素的顺序,他们是all, sequence, choice, group
all分组:使用all定义的元素组,在组中所有的元素成员都可以出现一次或者根本不出现,而且元素能够以任意顺序出现。
<xsd:all maxOccurs="0|1" minOccurs="0|1">
</xsd:all>sequence分组:sequence分组要求分组序列中的每个成员在实例文档中出现的顺序与定义的顺序相同。出现的次数由
maxOccurs
和minOccurs
控制。xsd:sequence
</xsd:sequence>choice分组:choice分组相当于DTD中的
"|"
,当子元素组合到choice中是,这些元素中只有一个元素必须在实例文档中出现,用于互斥的情况。<xsd:choice id="ID" maxOccurs="大于或等于0的整数|unbounded" minOccurs="大于或等于0的整数">
</xsd:choice>group分组:group分组是将若干个元素声明归为一组,一以便将他们当做一个组并入复杂类型的定义。
<xsd:group maxOccurs="大于或等于0的整数|unbounded" minOccurs="大于或等于0的整数" name="组名" ref="组名">
</xsd:group>
例子:
1)sample.xsd
<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema">
<xsd:element name="电影" type="演员"/>
<xsd:complexType name="演员">
<xsd:sequence>
<xsd:group ref="主演"/>
<xsd:element name="片名" type="类型"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="类型">
<xsd:choice>
<xsd:element name="中文" type="string"/>
<xsd:element name="英文" type="string"/>
</xsd:choice>
</xsd:complexType>
<xsd:group name="主演">
<xsd:sequence>
<xsd:element name="男主演" type="string"/>
<xsd:element name="女主演" type="string"/>
</xsd:sequence>
</xsd:group>
</xsd:schema>
2)sample.xml
<?xml version="1.0" encoding="GB2312"?>
<电影 xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance>
<男主演>小罗伯特·唐尼</男主演>
<女主演>格温妮丝·帕特洛</女主演>
<片名>
<中文>钢铁侠3</中文>
</片名>
</电影>
Schema的名称空间
名称空间是XML Schema中的重要部分,他提供了一种避免元素命名冲突的方法。名称空间的用途在于为XML中使用的名称提供一个容器。
名称空间的类型
XMLSchema中的名称空间共有三种类型:目标名称空间
,标准名称空间
,默认名称空间
。
<xsd:schema targetNamespace="http://www.itzcn.net/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.itzcn.net.xml">
名称空间的引用
在XML Schema文档中已经定义目标名称空间
<根元素名称 xmlns="http://www.itzcn.net/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itzcn.net/xml/要关联的文档名称.xsd" 属性名="属性值"
/>在XML Schema文档中没有定义目标名称空间
如果在XML Schema中只使用了标准名称空间http://www.w3.org/2001/XMLSchema,那就需要使用如下样式来关联XML文档:<根元素名称 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="要关联的文档名称.xsd"
属性名="属性值"
/>
XML学习笔记(三) -- Schema的更多相关文章
- delphi操作xml学习笔记 之一 入门必读
Delphi 对XML的支持---TXMLDocument类 Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...
- XML学习笔记
XML学习笔记 第一部分:XML简介 我们经常可以听到XML.HTML.XHTML这些语言,后两者比较清楚,一直不是很明白XML是什么,这里做一个总结. XML(eXtensible Markup L ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
随机推荐
- BizTalk开发系列(八) BizTalk Server 常识整理
1.什么是BizTalk Server? BizTalk 是业务流程管理服务器,用于连接人员,流程,有效管理和提升业务所需的信息.在原有版本业务 流程管理和SOA/ESB 的基础上,第5 个版 ...
- Openfire 的安装和配置
1. 下载最新的openfire安装文件 官方下载站点:http://www.igniterealtime.org/downloads/index.jsp#openfire 下载地址: Exe:htt ...
- Object对象类
Object对象类是所有类的祖先,他是默认自动继承的 Java为什么要做一个对象类呢?对象类的目的就是归一了类型,他就是把所有的类所有的对象归纳成为 Object类型.因为对象他认为对象应该拥有一些什 ...
- Vim简要说明
说明:在这篇文章里面,[C-X] 代表 Ctrl + X--就是按住 Ctrl 键然后再按 X.而且你可以在很多情况下使用 :help command 来获得大部分命令的帮助,这个是VIM的内部帮助文 ...
- Codeforces Round #350 (Div. 2) D2 二分
五一期间和然然打的团队赛..那时候用然然的号打一场掉一场...七出四..D1是个数据规模较小的题 写了一个暴力过了 面对数据如此大的D2无可奈何 现在回来看 一下子就知道解法了 二分就可以 二分能做多 ...
- 开发回归测试之Selenium开发环境搭建
前言 在解bug的过程中,经常遇到解完某个bug带来新的bug,原因一般是因为回归测试不足或不全面,下面我们来看看怎么利用selenium工具来完成开发后的回归测试, 虽然这可能是QA的事,不过有利于 ...
- Any changes made by a writer will not be seen by other users of the database until the changes have been completed
https://en.wikipedia.org/wiki/Multiversion_concurrency_control Multiversion concurrency control (MCC ...
- P1967 货车运输 -60分
打了一个最大生成树+dfs,60分成功tle #include <bits/stdc++.h> using namespace std; const int maxn = 10005; c ...
- Codeigniter2.25部署Linux(php5.6)
1).默认路由:修改system/core/Router.php 中第146行.如下图所示.ps:转换成小写我也是醉了...注释的代表是codeigniter作者写的,而上面的是我更改的 2).mod ...
- iOS:搭建本地的服务器
一.介绍 作为一个专业的程序员,不管你是前端还是移动端或者是后台,能够自己试着搭建一个本地的服务器还是很有必要的,有的时候,我们可以自己测试一些数据,很方便开发.其实,mac是自带有本地的服务器的,用 ...