XML(XML概述、XML约束、XML解析)(二)
Part02:XML约束
1、XML约束概念:
- 在XML技术中,可以编写一个文档来约束一个XML文档的书写规范,
2、XML约束分类:
常见的XML约束:DTD约束
、Schema约束
3、DTD约束
i、什么是DTD约束?
- DTD(Document Type Definition)文档类型定义,用来约束xml文档。规定xml文档中元素的名称,子元素的名称及顺序,元素的属性等等。
- DTD 是一套关于标记符的语法规则。它是XML1.0版规格得一部分,是XML文件的验证机制,属于XML文件组成的一部分。
- DTD 是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则。
- XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能够成为数据交换的标准,因为不同的公司只需定义好标准的DTD,各公司都能够依照DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。
- DTD文件是一个ASCII的文本文件,后缀名为.dtd
ii、DTD文档语法
1、创建一个以.dtd为文件后缀名的文件
2、dtd文档格式:
<!ELEMENT students (student*)>
<!ELEMENT student (name , age , gender , address)>
<!ELEMENT side (#PCDATA)>
<!ATTLIST student id CDATA #REQUIRED>
3、标签约束
<!ELEMENT 元素名称 类别> 或 <!ELEMENT 元素名称 (元素内容)>i、类别:
- 空标签: EMPTY。 表示元素一定是空标签。
- 普通字符串: (#PCDATA)。表示标签的内容一定是普通字符串(不能含有子标签)。
- 任何内容: ANY。表示元素的内容可以是任意内容(包括子标签)
ii、顺序问题
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>: 按顺序出现子标签iii、子标签出现次数问题:
标签 : 必须且只出现1次。
标签+ : 至少出现1次
标签* : 0或n次。
标签? : 0 或1次。
代码演示:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE person[
<!ELEMENT person (name,age,sex)>
<!--子元素只能出现一次
表示子元素可以出现的次数:
+:表示只能出现一次或者多次
?:表示零次或者一次
*:表示出现任意次
<!ELEMENT person (name+,age?,sex*)>
子元素列表以逗号隔开,表示出现的顺序
-->
<!ELEMENT person (name+,age?,sex*,census)>
<!--//复杂元素-->
<!ELEMENT name (#PCDATA)><!--//(#PCDATA)表示name是字符串类型-->
<!ELEMENT age EMPTY><!--//EMPTY表示age约束为空,不能有值-->
<!ELEMENT sex ANY><!--//ANY表示任意,可有值,可无值-->
<!ELEMENT census (side|country)>子元素用|隔开,表示只能出现一个
<!ELEMENT side (#PCDATA)>
<!ELEMENT country (#PCDATA)>
]>
<person>
<name>张三</name>
<name>李四</name>
<age></age>
<sex>女</sex>
<sex>女</sex>
<sex>女</sex>
<census>
<side>地球村</side>
<!-- <country>银河系</country> //side和country只能出现一个 -->
</census>
</person>
4、属性约束
<!ATTLIST 元素名称 属性名称 属性类型 默认值>1、属性类型:控制属性值的
CDATA :表示普通字符串
(en1|en2|…): 表示一定是任选其中的一个值
ID:表示在一个xml文档中该属性值必须唯一。值不能以数字开头
2、默认值:
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性不是必须的,但属性值是固定的
代码演示:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE person[
<!ELEMENT person (student*)>
<!ELEMENT student (name,age,sex,galaxy)>
<!--<!ATTLIST 元素名称
属性名称 属性类型 约束条件>-->
<!--
属性类型:
CDATA:字符串类型
枚举类型:(XX|XX|XX)只能在一定的范围内出现值,而且值只能出现一次
ID:只能以字母或下划线开头
约束条件:
#REQUIRED:属性必须存在
#IMPLIED:属性可有可无
#FIXED:表示一个固定值 #FIXED "ABC"//没有#FIXED就表示默认值
-->
<!ATTLIST student
name CDATA #REQUIRED
age ID #IMPLIED
sex (男|女) "男"
galaxy CDATA #FIXED "地球"
>
]>
<person>
<student name="张三" age="ten" galaxy="地球"></student>
<!--
name: 字符串类型 是必须出现的
age: ID类型 age属性可有可无
sex: 枚举类型 默认值是男
galaxy: 字符串类型 固定值就是"地球"
-->
</person>
iii.引入dtd文件到xml文档中三种方式
-
内部dtd:将约束规则定义在xml文档中
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE 书架 [ <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> <!ATTLIST 书 id ID #REQUIRED> ]> <书架> <书 id="id1"> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00元</售价> </书> <书 id="id2"> <书名>mySql</书名> <作者>王明</作者> <售价>28.00元</售价> </书> </书架>
-
外部dtd:将约束的规则定义在外部的dtd文件中
-
本地:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书 id="id1"> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00元</售价> </书> <书 id="id2"> <书名>mySql</书名> <作者>王明</作者> <售价>28.00元</售价> </书> </书架>
<!ELEMENT 书架 (书*)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> <!ATTLIST 书 id ID #REQUIRED>
-
网络:< !DOCTYPE 根标签名称 PUBLIC".dtd文件的位置URL">
-