1 Schema概述

1.1 什么是Schema

l  Schema是新的XML文档约束;DTD出现的比较早.

l  Schema要比DTD强大很多;

l  Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。( XML Schemas Definition )(xmlns : XML namespace)

1.2 Schema简介

  本课程中不对Schema深入探讨,我们只对Schema有个了解即可。

students.xsd

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn/xml" elementFormDefault="qualified"> 指定目标名称空间名称
<xsd:element name="students" type="studentsType"/> 定义students元素,类型为studentsType类型
<xsd:complexType name="studentsType"> 定义studentsType类型
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/> studentsType类型包含0~N个student元素
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType"> 定义studentType类型
<xsd:sequence> 子元素必须按顺序出现
<xsd:element name="name" type="xsd:string"/> studentType类型顺序包含子元素name,类型为字符串
<xsd:element name="age" type="ageType" /> studentType类型顺序包含子元素age,类型为ageType
<xsd:element name="sex" type="sexType" /> studentType类型顺序包含子元素sex,类型为sexType
</xsd:sequence>
<xsd:attribute name="number" type="numberType" use="required"/> studentType类型包含属性number,类型为numberType,该属性是必须的
</xsd:complexType>
<xsd:simpleType name="sexType"> 定义类型sexType
<xsd:restriction base="xsd:string"> 该类型是对string进行约束
<xsd:enumeration value="male"/> 指定枚举选项
<xsd:enumeration value="female"/> 指定枚举选项
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType"> 定义ageType类型
<xsd:restriction base="xsd:integer"> 该类型对integer进行约束
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="120"/> 范围为0~120
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType"> 定义numberType类型
<xsd:restriction base="xsd:string"> 对string类型进行约束
<xsd:pattern value="ITCAST_\d{4}"/> 指定正则表达式
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>

students.xml

<?xml version="1.0"?>
<students xmlns="http://www.itcast.cn/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.itcast.cn/xml students.xsd">指定默认名称空间,指定Schema约束文件
<student number="ITCAST_1001"> 子元素student,其中number属性是必须的,而且number属性值必须匹配正则表达式ITCAST_\d{4}
<name>zhangSan</name> 子元素name,内容为任意字符串
<age>20</age> 子元素age,内容必须是0~100之间的整数
<sex>male</sex> 子元素sex,内容必须是male和female其中之一。
</student>
<student number="ITCAST_1002">
<name>liSi</name>
<age>25</age>
<sex>female</sex>
</student>
</students>
2 Schema名称空间

2.1 什么是名称空间

如果一个XML文档中使用多个Schema文件,而这些Schema文件中定义了相同名称的元素时就会出现名字冲突。这就像一个Java文件中使用了import java.util.*和import java.sql.*时,在使用Date类时,那么就不明确Date是哪个包下的Date了。

总之名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突。

2.2 目标名称空间

在XSD文件中为定义的元素指定名称,即指定目标名称空间。这需要给<xsd:schema>元素添加targetNamespace属性。

l  <xsd:schema targetNamespace="http://www.itcast.cn/xml">

名称空间可以是任意字符串,但通常我们会使用公司的域名作为名称空间,这与Java中的包名使用域名的倒序是一样的!千万不要以为这个域名是真实的,它可以是不存在的域名。

如果每个公司发布的Schema都随意指定名称空间,如a、b之类的,那么很可能会出现名称空间的名字冲突,所以还是使用域名比较安全,因为域名是唯一的。

当使用了targetNamespace指定目标名称空间后,那么当前XSD文件中定义的元素和属性就在这个名称空间之中了。

2.3 XML指定XSD文件

在XML文件中需要指定XSD约束文件,这需要使用在根元素中使用schemaLocation属性来指定XSD文件的路径,以及目标名称空间。格式为:schemaLocation=”目标名称空间 XSD文件路径”

l  <students  schemaLocation="http://www.itcast.cn/xml students.xsd">

schemaLocation是用来指定XSD文件的路径,也就是说为当前XML文档指定约束文件。但它不只要指定XSD文件的位置,还要指定XSD文件的目标名称空间。

其中http://www.itcast.cn/xml为目标名称空间,students.xsd为XSD文件的位置,它们中间使用空白符(空格或换行)分隔。

也可以指定多个XSD文件,格式为:

l  schemaLocation=”目标名称空间1 XSD文件路径1 目标名称空间2 XSD文件路径2”

下面是spring配置文件的例子,它一共指定两个XSD文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
xsi:schemaLocation="http://www.springframework.org/schema/beans 第一个XSD文件的目标名称空间
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 第一个xsd文件的位置,这个网址必须是真实的,不然就找不到xsd文件了.
http://www.springframework.org/schema/aop 第二个xsd文件的目标名称空间
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> 第二个xsd文件的位置.
</beans>

xsi:schemaLocation="http://www.springframework.org/schema/beans    第一个XSD文件的目标名称空间

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    第一个XSD文件的位置,这个网址必须是真实的,不然就找不到XSD文件了。

http://www.springframework.org/schema/aop   第二个XSD文件的目标名称空间

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd    第二个XSD文件的位置

下面是JavaWeb项目的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>

2.4 定义名称空间

现在我们已经知道一个XML中可以指定多个XSD文件,例如上面Spring的配置文件中就指定了多个XSD文件,那么如果我在<beans>元素中给出一个子元素<bean>,你知道它是哪个名称空间中的么?

<beans
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean></bean>
</beans>

如果两个名称空间中都<bean>元素会怎么样呢?

所以只是使用schemaLocation指定XSD是不够的,它只是导入了这个XSD及XSD的名称空间而已。schemaLocation的作用就相当于Java中导入Jar包的作用!最终还是在Java文件中使用import来指定包名的。

xmlns是用来指定名称空间前缀的,所谓前缀就是“简称”,例如中华人发共和国简称中国一样,然后我们在每个元素前面加上前缀,就可以处理名字冲突了。

格式为:xmln:前缀=”名称空间”

注意,使用xmlns指定的名称空间必须是在schemaLocation中存在的名称空间。

<beans
xmlns:b="http://www.springframework.org/schema/beans" 指定b前缀
xmlns:aop="http://www.springframework.org/schema/aop" 指定aop前缀
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<b:bean></b:bean>
在使用元素时,需指定前缀,这就可以区别元素是哪个名称空间下的了。每个元素都要指定名称空间前缀,如果不指定那么元素就是没有名称空间。
<aop:scoped-proxy/>
</beans>

2.5 默认名称空间

在一个XML文件中,可以指定一个名称空间没有前缀,那么在当前XML文档中没有前缀的元素就来自默认名称空间。

<beans
xmlns="http://www.springframework.org/schema/beans"
指定默认名称空间,即没有前缀的名称空间,如果元素没有指定前缀,那么表示来自这个名称空间
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean></bean>
来自默认名称空间,因为没有前缀。
<aop:scoped-proxy/>
</beans>

2.6 W3C的元素和属性

如果我们的XML文件中需要使用W3C提供的元素和属性,那么可以不在schemaLocation属性中指定XSD文件的位置,但一定要定义名称空间,例如:

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 定义名称控件,这个名称空间来自w3c所以在下面的schemaLocation中无需指定
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
</beans>

上面定义了一个名称空间,前缀为xsi,名称空间为http://www.w3.org/2001/XMLSchema-instance。这个名称空间无需在schemaLocation中不存在这个名称空间。

你可能已经发现了,schemaLocation这个属性其实是w3c定义的属性,与元素一定,属性也需要指定“出处”,xsi:schemaLocation中的xsi就是名称空间前缀。也就是说,上面我们在没有指定xsi名称空间时,就直接使用schemaLocation是错误的。

关于XML的Schema文件讲解的更多相关文章

  1. web.xml的schema文件

    2.3和2.4: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLI ...

  2. xml语法、DTD约束xml、Schema约束xml、DOM解析xml

    今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...

  3. 【HTML/XML 10】XML文档中的Schema文件

    导读:DTD是对XML文档进行有效性验证的方法之一,事实上,继DTD之后,出现了用来规范和描述XML文档的第二代标准:Schema.Schema是DTD的继承,但是也有其不同的地方,它是真正的以独立的 ...

  4. solr 6.0 没有schema.xml未自动创建schema文件

    solr 6.0 没有schema.xml未自动创建schema文件 摘要:在之前的Solr版本中(Solr5之前),在创建core的时候,Solr会自动创建好schema.xml,但是在之后的版本中 ...

  5. schema文件及XML文件的DOM和Sax解析

    schema文件 <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="htt ...

  6. XML约束——Schema约束

    XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性 XML Schema VS DTD: •XML Schema符合XML语法结构. • ...

  7. [mondrian] 分析一个简单的schema文件

    <?xml version="1.0" encoding="UTF-8"?> <Schema name="Mondrian" ...

  8. 如何引入一个Schema 文件

    Schema(掌握如何引入一个schema文件)    * 名称空间 : 指的是一个环境,所用的标签来自于哪个环境定义的.    * 掌握引用schema文件:             xml中引入s ...

  9. JavaScripts学习日记——XML DTD Schema

    今日关键词: XML DTD Schema 1.XML 1 XML的概述 1.1 什么是XML XML全称为Extensible Markup Language,意思是可扩展的标记语言.XML语法上和 ...

随机推荐

  1. mexopencv问题:Invalid MEX file GLIBCXX_3.4.15 error

    参考:http://blog.sina.com.cn/s/blog_74112f030101cmxt.html root@debian-yuliyang:/opt/matlab/sys/os/glnx ...

  2. Fidder的几点补充

    坦克兄写的Fiddler教程很好很详细 链接这里:http://www.cnblogs.com/TankXiao/archive/2012/02/06/2337728.html 补充一: Fiddle ...

  3. suds 在python3.x上的安装并访问webservice

    类库安装 直接使用命令行:pip install suds 报错:Traceback (most recent call last):    File "setup.py", li ...

  4. OpenCV2.3.1中tbb_debug.dll is missing的解决办法

    方法1:        将\opencv\build\common\tbb\ia32目录下的tbb.dll复制改名为tbb_debug.dll  方法2:        若方法1失效,请将\openc ...

  5. HDU-4616 Game 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4616 比较典型的树形DP题目,f[u][j][k]表示以点u为子树,经过 j 个陷阱的最大值,其中k= ...

  6. A Tour of Go Function values

    Functions are values too. 在函数式语言中中函数都是变量,比如在javascript中 package main import ( "fmt" " ...

  7. nyoj 289 苹果

    苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. ...

  8. [Xcode使用 - 2] 设置APP图标和启动画面

    1.App Icon   把所有图标文件拖放到 “Images.xcassets” 的”AppIcon” 里面     应对非视网膜和视网膜屏,APP有时会提供两套不同大小的图片,1倍图和2倍图,它们 ...

  9. Umbraco Form需要引用些客户端dependencies (jquery)

    Preparing your frontend In order to work correctly Umbraco Forms needs some client dependencies, bei ...

  10. gulp 基础运用

    全局安装gulp $npm install --global gulp 作为项目的开发依赖安装 //--save-dev 开发依赖,储存在package.json的devDependencies中,如 ...