XML 的学习笔记2
XML编写约束
作为一个技术的使用者,我们怎么样编写xml文档才能够给程序读懂呢?如我们使用Spring MVC框架,这个时候就可以通过XML文档与这个半成品软件(框架)进行交互。研究者在编写框架的时候,是不知道我们将来编写的XML文档是怎么样的,这个时候就需要一个约束来规定编写,使得技术使用者能够通过阅读框架研究者编写的约束文档,来书写XML文档。
- 作为框架的使用者(程序员):
- 我们要能够在xml中引入约束文档
- 还需要能够读懂约束文档
约束分类
- DTD:一种简单的约束技术
- Scheme:一种复杂的约束技术
DTD约束的使用
-
引入dtd文档到xml文档中。
-
引入方式:
-
内部引入:将约束规则定义在xml文档中
-
外部引入:将约束规则定义在外部的dtd文件中
-
外部引入的分类:
-
本地引入:
<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
-
网络引入:
<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
-
-
-
-
举例
-
定义一个dtd约束文档
<!ELEMENT students (student+) > <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student number ID #REQUIRED>
- 文档说明:
- 通过 ELEMENT 来定义标签,通过 ATTLIST 来定义属性。
- 文档第一行声明了一个 students 标签,students 标签里面需要放一个或多个 student 子标签。
- 文档第二行定义了一个 student 标签,每个 student 标签里面可以放 name, age, sex 标签各一个,且需要按顺序。
- #PCDATA 声明的是该标签是字符串标签。
- 文档最后一行, 声明 student 标签有属性,属性名为 number,属性类型为 ID(即属性值必需唯一,不能重复)。#REQUIRED 规定该属性必须出现。
- 文档说明:
-
按照 dtd 约束文档,编写 xml 文档
-
xml 文档声明
<?xml version="1.0" encoding="UTF-8" ?>
-
引入dtd文档到xml文档中
-
外部引入
<!DOCTYPE students SYSTEM "student.dtd">
-
内部引入
<!DOCTYPE students [ <!ELEMENT students (student+) > <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student number ID #REQUIRED> ]>
-
-
根据 dtd 约束文档,编写 xml 文档内容
<students> <student number="A2018"> <name>Lee Hua</name> <age>21</age> <sex>male</sex> </student> <student number="B2018"> <name>Rainbow</name> <age>20</age> <sex>female</sex> </student> </students>
必须要按照约束来编写 xml 文档,否则会编译报错。
-
这个xml文档的所有内容如下:
-
本地外部引入
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE students SYSTEM "student.dtd"> <students> <student number="A2018"> <name>Lee Hua</name> <age>21</age> <sex>male</sex> </student> <student number="B2018"> <name>Rainbow</name> <age>20</age> <sex>female</sex> </student> </students>
-
内部引入
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE students [ <!ELEMENT students (student+) > <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student number ID #REQUIRED> ]> <students> <student number="A2018"> <name>Lee Hua</name> <age>21</age> <sex>male</sex> </student> <student number="B2018"> <name>Rainbow</name> <age>20</age> <sex>female</sex> </student> </students>
-
-
-
dtd 的的简单理解就完成了
Scheme约束的简单了解
对于dtd这个简单的约束技术,是有一定的缺陷的,比如上面的例子中:
<student number="A2018">
<name>Lee Hua</name>
<age>21</age>
<sex>male</sex>
</student>
对于age标签的内容、sex标签的内容,都无法进行约束,如我们把年龄(age)设置为1000,性别(sex)设置为 ABC,这明显是不行的,所以这个时候我们就可以使用更为复杂的约束 —— Scheme
XML Schema 是 DTD 的继任者
- XML Schema 可针对未来的需求进行扩展
- XML Schema 更完善,功能更强大
- XML Schema 基于 XML 编写
- XML Schema 支持数据类型
- XML Schema 支持命名空间
定义一个Scheme约束文档
直接对于这个定义的Scheme文档进行理解。
-
<?xml version="1.0"?>
XML Scheme 版本声明
-
<xsd:schema></xsd:schema>
对上面结点内的简述:
-
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
代码说明此schema中使用的元素和数据类型来自于"http://www.w3.org/2001/XMLSchema"名称空间(namespace)。它同样指出来自于"http://www.w3.org/2001/XMLSchema"名称空间的(全局)元素和数据类型必须使用带"xsd: "前缀。
-
备注:对于任何一个XML Schema定义文档都有一个最顶层的schema元素。而且该schema元素定义必须包含这个名称空间:http://www.w3.org/2001/XMLSchema。即此名称空间是由XML模式规范定义的标准名称空间-所有XML模式元素必须属于该名称空间。
-
targetNamespace="http://www.w3schools.com"
表明此 schema 定义的元素来自于"http://www.w3schools.com"名称空间。也就是说在引用该 Schema 的其它文档(包括自身文档)中要声明名称空间,其 URI 应该是 targetNamespace 的属性值。
-
elementFormDefault="qualified"
该属性值为 qualified 时,说明非全局元素必须添加命名空间的前缀。
该属性值为 unqualified 时,说明非全局元素不必也不能添加前缀。
-
-
<xsd:element name="students" type="studentsType"/>
这里的 element ,必须使用 "xsd:" 前缀。定义一个元素,元素名称为"students",类型为"studentsType"。此类型为自定义类型。下面需要声明这个自定义类型。
-
<xsd:complexType name="studentsType"> <xsd:sequence> <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType>
对上面这个结点的简述:
-
xsd:complexType name="studentsType"
这里的 complexType ,必须使用 "xsd:" 前缀。声明一个(自定义)类型,类型名称为"studentsType"。
-
<xsd:sequence> <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence>
这里的 sequence 和 element ,必须使用 "xsd:" 前缀。"xsd:element" 定义了一个元素,元素的名称为"student",类型为"studentType"。这个 student 元素最少出现0次,最多次数没有指定,即0次或多次。
-
-
<xsd:complexType name="studentType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="age" type="ageType" /> <xsd:element name="sex" type="sexType" /> </xsd:sequence> <xsd:attribute name="number" type="numberType" use="required"/> </xsd:complexType>
对上面这个结点的简述:
-
<xsd:complexType name="studentType"> ... </xsd:complexType>
自定义一个类型"studentType"。
-
<xsd:sequence> ... </xsd:sequence>
里面定义的内容都需要按顺序。
-
<xsd:element name="name" type="xsd:string"/> <xsd:element name="age" type="ageType" /> <xsd:element name="sex" type="sexType" />
定义了三个元素,这三个元素的名称分别是 name、age、sex ,这三个元素的类型分别是string类型、ageType类型、sexType类型。其中string类型是已有类型,其余两个类型需要自定义。
-
<xsd:attribute name="number" type="numberType" use="required"/>
定义一个属性,属性名称为 "number",类型为 "numberType" ,且这个属性不需要使用。属性类型为自定义类型。
-
-
<xsd:simpleType name="sexType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="male"/> <xsd:enumeration value="female"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="ageType"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="256"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="numberType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="stringbug_\d{4}"/> </xsd:restriction> </xsd:simpleType>
对上面这三个结点的简述:
-
xsd:simpleType 定义一个简单的类型
-
<xsd:simpleType name="sexType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="male"/> <xsd:enumeration value="female"/> </xsd:restriction> </xsd:simpleType>
定义一个简单的数据类型,基本的数据类型是string,enumeration 即枚举,数据只能在 "male" 和 "female" 之间选择。
-
<xsd:simpleType name="ageType"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="256"/> </xsd:restriction> </xsd:simpleType>
定义一个简单的数据类型,基本的数据类型是integer,最大数字是256,最小数字书0。
-
<xsd:simpleType name="numberType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="stringbug_\d{4}"/> </xsd:restriction> </xsd:simpleType>
定义一个简单的数据类型,基本的数据类型是string。
<xsd:pattern value="stringbug_\d{4}"/>
"pattern" 定义一个正则规则,正则表达式为:"stringbug_\d{4}"
-
XML 文档含有对 XML Scheme 的引用
如上定义的XML Scheme 约束,下面简单引用这个约束:
<?xml version="1.0" encoding="UTF-8"?>
<students
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com student.xsd"
>
<student number="stringbug_2020">
<name>Lee Hua</name>
<age>21</age>
<sex>male</sex>
</student>
<student number="stringbug_2018">
<name>Rainbow</name>
<age>20</age>
<sex>female</sex>
</student>
</students>
其中,
xmlns="http://www.w3school.com"
定义了该xml元素的默认命名空间为"http://www.w3school.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
又定义了一个命名空间,和前缀xsi关联,
xsi:schemaLocation="http://www.w3schools.com student.xsd"
设置xsi前缀代表的命名空间中的一个属性schemaLocation为"http://www.w3schools.com student.xsd"
student.xsd 为 scheme 约束文件的文件名,http://www.w3schools.com 为命名空间。Schema中的targetNamespace属性值必须和xsi:schemaLocation属性的第一个值相同。
浏览器中打开:
备注
如果需要引入多个 scheme 约束文件,那么我们就需要对这些引入的约束进行命名,用以区分,举例如:
<?xml version="1.0" encoding="UTF-8"?>
<students
xmlns:nameDistinction="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com student.xsd"
>
<nameDistinction:student number="stringbug_2020">
<name>Lee Hua</name>
<age>21</age>
<sex>male</sex>
</nameDistinction:student>
<nameDistinction:student number="stringbug_2018">
<name>Rainbow</name>
<age>20</age>
<sex>female</sex>
</nameDistinction:student>
</students>
对比一下 XML 文档含有对 XML Scheme 的引用 与 备注 的例子中的区别。
其中最主要的是:
-
使用自己定义的student.xsd约束文件
-
引入student.xsd约束文件
-
XML 文档含有对 XML Scheme 的引用 例子
xmlns="http://www.w3schools.com"
采用默认命名,后续的标签都默认使用该约束
-
备注 中例子
xmlns:nameDistinction="http://www.w3schools.com"
这里使用命名为nameDistinction,这个名字可以自己随意定义,后续标签如果需要使用该约束,那么就需要在每个标签中添加":nameDistinction"。如:
<nameDistinction:student number="stringbug_2020"> ... </nameDistinction:student>
而对于 XML 文档含有对 XML Scheme 的引用 例子,不需要添加,因为下面使用的标签都需要根据所引入的约束来编写,如:
<student number="stringbug_2020"> ... </student>
-
本文来自博客园,作者:LeeHua,转载请注明原文链接:https://www.cnblogs.com/liyihua/p/14477543.html