XML Schema 文件自身就是一个XML文件,但它的扩展名通常为.xsd,和XML文件一样,一个XML Schema文档也必须有一个根结点,但这个根元素的名称为Schema。
XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式。 XML Schema规定XML文档实例的结构和每个元素/属性的数据类型。
Schema命名空间:
命名空间的使用在XML中主要有两个目的:
1.用于区分那些名称相同但来自不同schema库,具有不同含义的元素和属性。通过将元素、属性与URL相关联,命名空间能够区分具有相同名称的元素
2.在一个单一的XML应用中,将相关的元素和属性组合起来,使它们可以很容易地被软件包识别,名称空间用一个唯一的URI表示,仅起到唯一标识的作用。
1.用于区分那些名称相同但来自不同schema库,具有不同含义的元素和属性。通过将元素、属性与URL相关联,命名空间能够区分具有相同名称的元素
2.在一个单一的XML应用中,将相关的元素和属性组合起来,使它们可以很容易地被软件包识别,名称空间用一个唯一的URI表示,仅起到唯一标识的作用。
分类:
默认命名空间声明:不带前缀 ,默认命名空间只能有一个
默认命名空间声明:不带前缀 ,默认命名空间只能有一个
•格式:xmlns=“url”
•例如:xmlns="http://www.w3.org/2001/XMLSchema"
显式命名空间声明:声明时指定前缀
显式命名空间声明:声明时指定前缀
•格式:xmlns: quoteName =“url”
Schema实例:
1)定义一个简单元素:
2)定义含有子元素的元素(子元素有顺序):
3)定义含有子元素的元素(子元素没有顺序):
4)定义含有子元素的元素(任选一个):
5)仅含有属性的空元素 && 仅含有属性的空元素,属性必须写:
6)必须含有属性的非空元素:
7)必须含有属性也包含子元素的元素:
8)元素内容必须在2——5之间的数:
9)包含多个指定元素:
10)将身份证号格式化,自定义类型:
综上所述之后,可以参考下列代码,加深印象:
代码1:
books.xml:
<?xml version="1.0" encoding="UTF-8"?> <books xmlns="http://www.example.org/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/books books.xsd" > <!-- 在文档关联中,如何确定文件的位置 * 官方规定,* http://www.w3.org/2001/XMLSchema-instance * 将当前的xml文档实例化 * schemaLocation属性(两个参数空格隔开) * 第一参数:实例化所需要的schema文档的名称 * 第二参数:schema文档的相对路径URI --> <!-- schema引用流程 1.新建schema文件,确定schema名字,即命名空间 2.创建自己的根节点 3.在web project/WebRoot/WEB-INF/web.xml拷贝内容 4.修改根元素、修改命名空间、修改schema位置 --> </books>books.xsd:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/books" xmlns:tns="http://www.example.org/books" elementFormDefault="qualified" attributeFormDefault="qualified"> <!-- 1、当前的文档books.xsd是schema文档 2、targetNamespace * 为当前的schema文档命名,为自己取一个名字 * 属性值:自定义 * 要求:必须全球唯一 * 一般采用URL,域名 * 例如:www.itcast.cn http://www.example.org/books * 命名空间Namespace 3、xmlns --》 xml namespace * 声明引入指定名称的命名空间,引用已有的命名空间,默认的 * 作用:使用指定命名空间已定义好的所有内容 * 例如:http://www.w3.org/2001/XMLSchema w3c起的名 * 官方为自己的schema文档起的名称 * 格式:xmlns:别名 * xmlns:xs * 使用:xs:schema,从当前别名xs所代表的schema文档中定义了schema元素 * 格式2:xmlns(默认命名空间引用) * 好处:防止命名冲突 --> <!-- elementFormDefault: 一个实例文档中被局部声明的元素是否必须被目标命名空间(targetNamespace)所规范 qualified:任何xml实例文档必须声明其在schema文档中使用的每一个命名空间 unqualified:在XML实例文档“隐藏”该命名空间,因此在实例文档中仅需对目标命名空间进行命名空间声明 attributeFormDefault: 元素用于指定局部属性是否受到该schema指定targetNamespace所指定的名称空间限定 --> <!-- 定义根元素 element --> <xs:element name="books"></xs:element> </xs:schema>
代码2:
books2.xml:
<?xml version="1.0" encoding="UTF-8"?> <books xmlns="http://www.example.org/books2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/books2 books2.xsd" > <ele></ele> <person> <name></name> <age></age> </person> <user> <age></age> </user> <worker> <age></age> <name></name> </worker> <price unit="¥">1234</price> </books>books2.xsd:
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/books2" xmlns:tns="http://www.example.org/books2" elementFormDefault="qualified"> <!-- 定义根元素 element --> <element name="books"> <complexType> <sequence> <!-- 1、定义元素 <ele></ele> --> <element name="ele"></element> <!-- 2、定义元素包含子元素 ** 顺序 ** dtd,<person> <name></name> <age></age> </person> * 当前子元素的类型 * 复合类型 complexType * 简单类型simpleType * 子元素的顺序 --> <element name="person"> <complexType> <!-- 符合类型 --> <sequence> <!-- 顺序,内部包含的子元素 --> <element name="name"></element> <element name="age"></element> </sequence> </complexType> </element> <!-- 3、定义元素包含子元素 ** 选择 ** dtd | <user> <name></name> <age></age> </user> * 当前子元素的类型 * 符合类型 complexType * 简单类型simpleType * 子元素的顺序 --> <element name="user"> <complexType> <choice><!-- 选择 --> <element name="name"></element> <element name="age"></element> </choice> </complexType> </element> <!-- 4、定义元素包含子元素 ** 没顺序 ** dtd | <worker> <name></name> <age></age> </worker> * 当前子元素的类型 * 符合类型 complexType * 简单类型simpleType * 子元素的顺序 --> <element name="worker"> <complexType> <all> <element name="name"></element> <element name="age"></element> </all> </complexType> </element> <!-- 5、包含属性,有内容的元素 <price unit="¥">34</price> --> <element name="price"> <complexType> <simpleContent> <!-- 简单内容 --> <!-- 扩展,将简单的内容扩展成复杂的类型 base:确定简单内容的类型 --> <extension base="integer"> <!-- 定义属性 name:确定名称 type:确定类型 use: * optional 可选 * required 必须 * prohibited 禁用 --> <attribute name="unit" type="string" use="required"> </attribute> </extension> </simpleContent> </complexType> </element> </sequence> </complexType> </element> </schema>
代码3:
books3.xml:
<?xml version="1.0" encoding="UTF-8"?> <books unit="abc" xmlns="http://www.example.org/books3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/books3 books3.xsd" >123</books>books3.xsd:
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/books3" xmlns:tns="http://www.example.org/books3" elementFormDefault="qualified"> <!-- 默认官方xmlns="http://www.w3.org/2001/XMLSchema" 使用自定愿意类型,需要引入自定声明的schema文档的名称 --> <!-- 确定根元素 --> <element name="books" type="tns:myType"> </element> <!-- 声明类型 自定义类型 name:定义名称 --> <complexType name="myType"> <simpleContent> <!-- 简单内容 --> <extension base="integer"> <attribute name="unit" type="string" use="required"></attribute> </extension> </simpleContent> </complexType> </schema>
补充:
XML Schema基础概念:
属性相关定义: