xml约束
xml主要用来存储数据,而不同的数据有不同数据及结构,为了使数据在存入xml时不出错的满足某项标准,因此需要对xml进行约束来规范数据的存储。
xml的约束技术有两种:dtd和schema,这里主要介绍下dtd
什么是dtd?
文档类型定义(Document Type Definition)是一套为了进行程序间的数据交换而建立的关于标记符的语法规则。
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
上面规定了xml中note元素下只能有4种标签,每个标签必须出现,按to,from,heading,body的顺序出现,且只能出现一次,note下面的子元素内容都是字符串类型。
它用一串代码实现的语法规则,xml只需要引入就可以用,主要应用在eclipse等集成开发环境中,如果不符合约束则会报错。
引入dtd
dtd引入方式和css,js引入比较像,分为:外部引入和内部引入
内部引入
例子:
<?xml version="1.0"?>
<!--dtd开始-->
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<!--dtd结束-->
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
语法:
<!DOCTYPE 根元素 [dtd内容]>
外部引入
外部引入又分为两种:系统引入和网络引入
一个是从自身的计算机文件系统中引入,一个是从网络上引入。
系统引入:
例子:
<!DOCTYPE note SYSTEM "note.dtd">
语法:
<!DOCTYPE 根元素 SYSTEM "文件路径">
网络引入:
例子(mybatis配置文件的dtd约束):
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
语法:
<!DOCTYPE 根元素 PUBLIC "dtd名称" "dtd文件的url">
dtd语法规则
dtd:元素约束
包括元素的数量,内容类型约束
首先要简答的了解下正则表达式的某些符号:*,?,+,|
a*表示*前面的a可以出现零次或多次
a?表示a可以出现和不可出现
a+表示a可以出现一次或多次
a|b表示要么是a,要么是b,不能同时出现
元素分为:简单元素(无子元素),复杂元素(有子元素)
声明一个元素的语法:
<!ELEMENT 元素名称 类别>
类别有:EMPTY,ANY,#PCDATA,(子元素[,子元素])
EMPTY:为空
ANY:都可以
#PCDATA:字符串
(子元素[,子元素]):复杂元素,内容只能为子元素
注意:每一个想要在xml出现的元素都要在dtd中声明,否则会报错。
在一个复杂元素中约束子元素出现的数量用*,?,+,|.
比如:
<!DOCTYPE person [
<!ELEMENT person (name*,age?,sex+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
]>
用上面修饰的dtd中元素person中:
name标签可以出现零次或多次
age标签可以出现和不出现
sex标签可以出现一次或多次
如果改成:
<!DOCTYPE person [
<!ELEMENT person (name*|age?|sex+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
]>
将,
换成|
,则name,age,sex标签只能出现其中一个
dtd:属性约束
声明一个属性的语句:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
元素名称:所属的元素
属性类型:
默认值:
例子:
<!ATTLIST person name CDDATA #REQUIRED>
表示<person name="John" ></person>
中name必须存在,且类型为字符串
<!ATTLIST person sex (male|female) #REQUIRED>
表示<person sex="male" ></person>
中sex必须在male和female中选,且必须存在
dtd:实体
实体类似于变量,可以将实体中的值取出来
例子:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
使用:
<author>&writer;©right;</author>
语法:<!ENTITY 实体名称 "实体的值">