- 为何XML需要约束?
<?xml version="1.0" encoding="utf-8"?>
<person>
<name>zhangsan</name>
<age>20</age>
<猫>10</猫>
</person>
在这段代码中,人的属性有姓名,年龄,猫是人的属性显然是不合理的,由于XML的标签是自定义的,我们要通过相关约束技术来规定XML中只能出现的元素。
-
如何进行约束?
约束技术:dtd约束和schema约束。dtd约束(快速入门):
- 创建一个后缀名为dtd的文件
- 观察XML中有几个元素,就在dtd文件中写几个
<!ELEMENT>
- 判断元素是简单元素还是复杂元素:
简单元素:没有子元素
<!ELEMENT 元素名称 (#PCDATA)>
复杂元素:有子元素
<!ELEMENT 元素名称 (子元素)>
- 需要在XML文件中引入dtd文件
<!DOCTYPE 根元素 SYSTEM "dtd文件的路径">
book.dtd
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
book.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>葵花宝典</书名>
<作者>东方不败</作者>
<售价>15.00元</售价>
</书>
<书>
<书名>九阳神功</书名>
<作者>张无忌</作者>
<售价>56.00元</售价>
</书>
</书架>
- dtd的三种引入方式:
- 外部引入:如上
- 内部引入:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE person [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<person>
<name>zhangsan</name>
<age>20</age>
<!-- <猫>10</猫>-->
</person>
3. 使用外面的dtd(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" “DTD文档的URL”>
- 使用dtd定义元素:
- 语法:<!ELEMENT 元素名 约束>
- 简单元素:没有子元素的元素 <!ELEMENT 元素名 (子元素)>
约束
:
(#PCDATA):字符串
EMPTY:为空
ANY:可为空or不为空
复杂元素:有子元素的元素,子元素用英文逗号按照顺序分隔(用 | 分隔时表示子元素只能出现任意一个)<!ELEMENT 元素名称 (子元素+,/| 子元素1..)>
+:表示至少出现一个相关元素
?:表示出现一次或零次相关元素
*:表示零次或多次出现相关元素
- 使用dtd定义属性:
- 语法:<!ATTLIST 元素名称 属性名称 属性类型 属性的约束>
- 属性的类型:
CDATA:字符串
枚举:值只能是列举的范围内出现的,且一次只能出现一个(如(aa|bb|cc))
ID:值只能是字母或下划线开始 - 属性的约束:
#REQUIRED:表示该属性必须出现
#IMPLIED:表示该属性可有可无
#FIXED:表示该属性只能是设置的值(写法:#FIXED “123”)
直接值:不写属性,使用直接值,写了属性,使用写的值
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE person [
<!--元素-->
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT height (#PCDATA)>
<!ELEMENT weight (#PCDATA)>
<!--属性 -->
<!ATTLIST name ID1 CDATA #REQUIRED>
<!--AA必须出现-->
<!ATTLIST age ID2 (AA|BB|CC) #REQUIRED>
<!--ID2的值只能是AA|BB|CC中的值-->
<!ATTLIST height ID3 ID #IMPLIED>
<!--ID3可有可无-->
<!ATTLIST weight ID4 #FIXED "DD">
<!--ID4只能是DD-->
]>
<person>
<name ID1="AA">zhangsan</name>
<age ID2="BB">20</age>
<height ID3="_CC">178</height>
<weight ID4="DD">77</weight>
</person>
浏览器只负责校验XML的语法,不负责校验,校验XML的约束需要使用工具(如myeclipse)。