XML的DTD约束
DTD约束:DTD的声明和引用
1.内部DTD文档
<!DOCTYPE 根元素 [定义内容]>
2.外部DTD文档
<!DOCTYPE 根元素 SYSTEM "DTD文件路径"> 或者 <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">
3、DTD元素基本语法: <!ELEMENT 元素名称 类别> 或 <!ELEMENT 元素名称 (元素内容)>
- ELEMENT是关键字,是不能修改的
-元素类型,必须要大写!CONTENT的内容有三种写法:
(1)EMPTY——表示该元素不能包含子元素和文本,但可以有属性。 (2)ANY——表示该元素可以包含任何在该DTD中定义的元素内容 (3)#PCDATA——可以包含任何字符数据,但是不能在其中包含任何子元素
组合类型,有下述的的修饰符可以使用:
符号 | 用途 | 示例 | 示例说明 |
---|---|---|---|
() | 用来给元素分组 | (古龙|金庸),(王朔|余杰) | 分成两组 |
| | 在列出的对象中选择一个 | (男人|女人) | 表示男人或者女人必须出现,两者至少选其一 |
+ | 该对象必须出现一次或者多次 | (成员+) | 表示成员必须出现,而却可以出现多个成员 |
* | 该对象允许出现0次或者多次 | (爱好*) | 爱好可以出现两次到多次 |
? | 该对象必须出现0次或者1次 | (菜鸟?) | 菜鸟可以出现,也可以不出现,如果出现的话,最多只能出现一次 |
, | 对象必须按指定的顺序出现 | (西瓜,苹果,香蕉) | 表示西瓜、苹果、香蕉必须出现,并且按这个顺序出现 |
例如:
<!ELEMENT 家庭 (人+,家电*)>
<!ELEMENT to EMPTY>
<!ELEMENT body (#PCDATA)>
4、属性的定义:
<!ATTLIST 元素名称
属性名称 类型 属性特点
属性名称 类型 属性特点
...... >
属性的类型:(1) CDATA (2) ID (3) IDREF/IDREFS (4) Enumerated (5) ENTITY/ENTITIES
(1)属性类型-CDATA,表示属性值可以是任何字符(包括中文和数字)
(2)属性类型-ID,表明该属性的取值必须是唯一的,但是属性的值不能是以数字开头!
(3)属性类型-IDREF/IDREFS
(4)属性类型-Enumerated,事先定义好一些值,属性的值必须在所列出的值的范围内。
(5)属性类型-ENTITY,实体
实体定义:
- 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
- 在DTD定义中,一条!ENTITY语句用于定义一个实体。
- 实体可分为两种类型:引用实体和参数实体。引用实体是被XML文档应用的,而参数实体是被DTD文件本身应用的。
①引用实体:<!ENTITY 实体名称 "实体内容">
<!ENTITY copyright "I am a programmer"> .... ©right;
②参数实体:<!ENTITY % 实体名称 "实体内容">
<!ENTITY % TAG_NAME "姓名|EMAIL|电话|地址"> <!ELEMENT 个人信息 (%TAG_NAME;|生日)> <!ELEMENT 客户信息 (%TAG_NAME;|公司名)>
属性的特点:
(1) #REQUIRED,表示这个属性必须给,不给就报错
(2) #IMPLIED,表示这个属性可以给也可以不给
(3) #FIXED value,表示这个属性必须给一个固定的value值
(4) Default value,表示这个属性如果没有值,就分配一个默认的value值
DTD实际案例:
DTD文件:
<!ENTITY AUTHOR "John Doe"> <!ENTITY COMPANY "JD Power Tools, Inc."> <!ENTITY EMAIL "jd@jd-tools.com"> <!ELEMENT CATALOG (PRODUCT+)> <!ELEMENT PRODUCT (SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)> <!ATTLIST PRODUCT NAME CDATA #IMPLIED CATEGORY (HandTool|Table|Shop-Professional) "HandTool" PARTNUM CDATA #IMPLIED PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago" INVENTORY (InStock|Backordered|Discontinued) "InStock"> <!ELEMENT SPECIFICATIONS (#PCDATA)> <!ATTLIST SPECIFICATIONS WEIGHT CDATA #IMPLIED POWER CDATA #IMPLIED> <!ELEMENT OPTIONS (#PCDATA)> <!ATTLIST OPTIONS FINISH (Metal|Polished|Matte) "Matte" ADAPTER (Included|Optional|NotApplicable) "Included" CASE (HardShell|Soft|NotApplicable) "HardShell"> <!ELEMENT PRICE (#PCDATA)> <!ATTLIST PRICE MSRP CDATA #IMPLIED WHOLESALE CDATA #IMPLIED STREET CDATA #IMPLIED SHIPPING CDATA #IMPLIED> <!ELEMENT NOTES (#PCDATA)>
对应的XML:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE CATALOG SYSTEM "product.dtd"> <CATALOG> <PRODUCT NAME="康帅傅矿泉水" CATEGORY="Table" PARTNUM="12" PLANT="Chicago"> <SPECIFICATIONS WEIGHT="20" POWER="18">这里是细节</SPECIFICATIONS> <PRICE>25</PRICE> <PRICE>28</PRICE> </PRODUCT> </CATALOG>