初学XML(2) DTD(Document type defintnion)文档类型定义
一:DTD(Document type defintnion)文档类型定义
A:作用:
验证一个XML文档是否合法有效(ISO9001)
B:如何来约束XML文档
1:如何来约束XML文档元素
元素出现次数的约束:
+ 代表该元素至少出现一次 也可以出现多次
* 代表该元素可出现可不出现 出现的时候可以是多次
? 代表带元素可以不出现 但是出现的时候只能是一次
元素的类型
(#PCDATA) 代表该元素没有子元素 但是有元素内容
EMPTY 代表该元素既没有子元素 也没有元素内容
ANY 带表该元素包含了在文档中出现的其他任何子元素
一般修饰根元素
格式:
<!ELEMENT 元素名称 出现次数 类型以及关系>
2:如何来约束XML文档属性
格式:
<!ATTLIST 属性所在的元素名称 属性名称 属性类型
属性约束>
属性的类型:
CDATA 代表该属性可以包含字符数据
ID 代表该属性的值是唯一的
IDREF 指向文档中出现的一个属性
IDREFS指向文档中出现的多个属性
属性的约束:
#REQUIRED 代表该属性必须出现
#IMPLIED 代表该属性的可以不出现
#FIXED 值 代表该属性只能取某一个值
默认值 有新值的时候取新值 否则取默认值
3:实体
就是一个调用关系
请牢记系统的5个实体 < -- < , > -- > , & -- & , " -- " , &apos -- '
3.1 DTD中的内部实体
在XML的文档中的表现形式??
语法: <!ENTITY entity-name "entity-value">
DTD 示例:
<!ENTITY writer "王俊">
<!ENTITY copyright "Copyright XML1.0">
XML 示例:
<author> &writer; ©right;</author>
3.2 DTD中的外部实体
外部实体指内容在XML文档之外的实体。
SYSTEM 关键字用于指定所有在文档之外的实体。
语法: <!ENTITY entity-name SYSTEM "URI/URL">
例: 将实体引用替换成指定的文档内容.
DTD: <!ENTITY writer SYSTEM "http://www.xml101.com/entities/entities.xml">
XML: <author>&writer;</author>
3.3 DTD 中的参数实体
只能在DTD文档中出现。
DTD 示例:
<!ENTITY %p "a">
<!ELEMENT roster ((%p;)+)>
<!ELEMENT %P; (name,age,address)>
其中p是参数实体,a是p的省略值. 根据p 的不同,DTD中roster子元素也不同。
这种用法一般用于 两个不同元素的XML文件共同关联一个DTD文件。
XML 示例:
一个文件是: <!ENTITY %p "student">
别一个文件是:<!ENTITY %p "teacher">
student 和 teacher 分别为两个文件中的roster的子元素。
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT TVGuide (Channel+)>
<!ELEMENT Channel (Name,Program+)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Program (Start,Duration,Series,Title,Description?,CastList?,Writers?,Director?,Producer?)>
<!ELEMENT Start (#PCDATA)>
<!ELEMENT Duration (#PCDATA)>
<!ELEMENT Series (#PCDATA)>
<!ELEMENT Title (#PCDATA)>
<!ELEMENT Description (#PCDATA)>
<!ELEMENT CastList (CastMember+)>
<!ELEMENT Writers (Writer)>
<!ELEMENT Writer (Name)>
<!ELEMENT Director (Name)>
<!ELEMENT Producer (Name)>
<!ELEMENT CastMember (Character,Actor)>
<!ELEMENT Character (Name)>
<!ELEMENT Actor (Name)>
<!ATTLIST TVGuide Start CDATA #REQUIRED end CDATA #REQUIRED>
<!ATTLIST Program rating CDATA #IMPLIED flag CDATA #IMPLIED type CDATA #FIXED "document">
例子: 一个简单的 introduce.dtd 文件和 introduce.xml文件.
--------xml文件---------
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE school SYSTEM "introduce.dtd">
<school>
<!--<class>-->
<student stuID="s001">
<!--因为dtd文件中的属性设为ID(唯一的属性值),因此值的数字前面一定要加字母,否则出错。如 错误 [333] 正确 [s333] -->
<name>wangjun</name>
<age>28</age>
<address>应城</address>
</student>
<student stuID="s1003">
<name>duping</name>
<age>22</age>
<address>仙桃</address>
</student>
<student stuID="s005">
<name>chenjie</name>
<age>26</age>
<address>武汉</address>
</student>
<!--</class>-->
</school>
---------------dtd文件--------------
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT school (student+)>
<!ELEMENT student (name,age,address)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ATTLIST student stuID ID #REQUIRED>
====================over========================