一、DTD——描述xml的文档结构
1.DTD是用来校验xml文件的,DTD的全称Document Type Defintion,用来描述xml的文档结构,一个DTD文档包含:
1>.元素(ELENENT)的定义
2>.无素之间的无素关系
3>.属性(ATTLIST)的定义规则
4>.可以使用实体(ENTITY)或等符号(NOTATION)规则
2.如何生成一个DTD文档
1>.DTD和xml的关系:类似于类和对象之间的关系,一个类可以new多个对象,DTD是抽象的,而xml是具体的.
2>.DTD文档的声明及引用
1.内部DTD文档<!DOCTYPE 根元素[定义内容],例如:innerDTD.xml
<?xml version="1.0" encoding="gb2312" ?> <!DOCTYPE poem[ <--根元素的名称 <!ELEMENT poem(author,title,content)> <--子元素的名称及顺序 <!ELEMENT author(#PCDATA)> <--子元素的数据类型 <!ELEMENT title(#PCDATA)> <!ELEMENT content(#PCDATA)> ]> <---标签结束 <poem> <author>王维</author> <title>鹿柴</title> <content> 空山不见人,但闻人语声。 返景入深林,复照青苔上。 </content> </poem>
2.外部DTD文档<!DOCTYPE 根元素 SYSTEM "DTD文件路径">例如:
outer.xml <?xml version="1.0" encoding="gb2312" ?> <!DOCTYPE poem SYSTEM "outer.dtd"> <poem> <author>王维</author> <title>鹿柴</title> <content> 空山不见人,但闻人语声。 返景入深林,复照青苔上。 </content> </poem> outer.dtd <?xml version="1.0" encoding="gb2312" ?> <!ELEMENT poem(author,title,content)> <!ELEMENT author(#PCDATA)> <!ELEMENT title(#PCDATA)> <!ELEMENT content(#PCDATA)>
3.内部DTD文档结合<!DOCTYPE 根元素 SYSTEM "DTD文件路径">例如:
mixed.xml <?xml version="1.0" encoding="gb2312" ?> <!DOCTYPE poem SYSTEM "mixed.xml" [ <!ELEMENT poem(author,title,content)> <!ELEMENT author(#PCDATA)> ]> <poem> <author>王维</author> <title>鹿柴</title> <content> 空山不见人,但闻人语声。 返景入深林,复照青苔上。 </content> </poem> mixed.dtd <?xml version="1.0" encoding="gb2312" ?> <!ELEMENT title(#PCDATA)> <!ELEMENT content(#PCDATA)>
3>.元素的定义
1.语法:<!ELEMENT NAME CONTENT>
ELEMENT:关键字
NAME:元素名称
CONTENT:元素类型
2.CONTENT:元素类型
EMPTY:该元素不能包含子元素和文本,但可以有属性-(空无素)。
ANY:该元素可以包含任何在DTD中定义的元素内容,
将根元素设为ANT类后,元素出现的次数和顺序不受限制(很少使用)。
#PCDATA:可以包含任何元素字符数据,但是不能在其中包含任务子元素(使用比较多)。
纯元素类型:只包含子元素,并且子元素中没有文本(使用比较多)。
混合类型:包含子元素和文本数据的混合体(很少使用)。
组合类型示例:<!ELEMNT 家庭 (人+,家电*)> 如:
<家庭>
<人 名字="李白" 性别="男" 年龄="25" />
<人 名字="杜甫" 性别="男" 年龄="26" 爱好="吟诵" />
<家电 名称="彩电" 数量="3" />
</家庭>
符号 用途 示例 说明
() 用来给元素分组 (李白|杜甫),(李小龙),金庸 分成三组
| 在列出的对象中选择一个 (男|女) 表示男或女必须出现,两者选一
+ 该对象至少出现一次, (成员+) 表示成员必须出现,而且可以出现多个成员
可以出现多次(1或者N次)
* 该对象允许出现零次到任意多次 (爱好*) 爱好可以出现零到多次
? 该对象可以出现, (菜鸟?) 菜鸟可以出现可以不出现,如果出现的话,最多出现一次
但只能出现0到1次
, 对象必须按指定的顺序出现 (北京,天津,重庆,上海) 表示北京,天津,重庆,上海必须出现,按照这个顺序出现
4>.属性的定义
1.语法:<!ATTLIST 元素名称 属性名称 类型 属性特点>
类型:CDATE 任何字符数据(包括数字和中文)
NMTOKEN 是一个CDATE的字集,表示属性值必须是英文字母、数字、句号、破折号、下划线或冒号,属性值不能含有空格。
NMTOKENS 和NMTOKEN类似,包含多个由空格分隔的字符。
ID 表示该属性的取值必须是唯一的。
IDREF/IDREFS IDREF引用其它的ID。
NMTOKEN/NMTOKENS 事先定义好一些值,属性的值,必须在所列出的的值的范围内。
例如:<!ATTLIST person 婚姻状态(single|married|divorced|widowed) #IMPLIED>
Enumberated
ENTITY/ENTITES
NOTATION
NOTATIONS
属性特点:
#REQUIRED 必须的 元素的所有的实例都必须有该属性的值(这个属性值必须要出现)
#IMPLIED 可选的 元素的实例中可以忽略该属性(NULL)。<!ATTLIST content fax CDATE #IMPLIED> 表示fax属性可有可无。
#FIXED value 确定值 <!ATTLIST sender company CDATE #FIXED "Microsoft"> 属性值必须为Microsoft
Default value
5>.实义实体
1.内部实体 语法:<!ENTITY 实体名 "实体值">
2.外部实体 语法:<!ENTITY 实体名 SYSTEM "URI/URL"> 例如:
DTD示例:<!ENTITY struts SYSTEM "http://struts.apache.org/dtds/struts-2.3.dtd">
XML示例:<author>&struts</author>
3.实体类型:普通实体、外部实体、参数实体、外部参数实体
类型 普通实体 参数实体
使用场合 用在xml文档中 只用在DTD中元素和属性中声明
声
明 内部 <!ENTITY 实体名 "文本内容"> <!ENTITY %实体名 "文本内容">
方
式 外部 <!ENTITY 实体名 SYSTEM "外部文件URL地址"> <!ENTITY% 实体名 SYSTEM "外部文件URL地址">
引用方式 &实体名; %实体名;
4.普通实体:普通实体是指在xml中用的。参数实体:参数实体是指在xml中用的。
例如:
<!ENTITY %地址 "街道,城市,邮政,国家">
<!ELEMENT 联系人(人名,电话,%地址;)>
4>.命令空间(Namespace)
1.命令空间:避免元素名冲突
2.使用URL做为XML的Namespace
3.命名空间的语法定义:xmlns:[prefix="URL"]
4.元素和属性都可以做为应用命名空间
5.加前缀决解元素名冲突,例如:
<h:table xmlns:h="http://www.w3c.org/TR/html4"> <h:td>Apples<h:td /> <h:td>Bananas<h:td /> </h:table> <f:table xmlns:h="http://www.w3schools.com/furniture"> <f:name>African Coffe Table<f:name /> <f:width>Bananas<f:width /> <f:length>120<f:length /> </f:table>
6.总结
1.一个有效的XML文件必须是结构正规的。结构正规的XML文档不一定是有效的。
2.DTD包含一套用来描述并限制XML文档的语法规则。
1.元素定义规则
2.元素之间的关系规则
3.属性的定义
4.可使用的实体或符号规则
3.命令空间:避免元素名冲突
4.在XML中,使用全球唯一的URL作为Namespace