XML学习之路(二)

DTD

一、什么是DTD?

DTD即Document Type Definition,文档类型定义。

我们知道,XML的标签可以自定义,不受任何约束。但有时侯,为了符合逻辑和业务需要,我们需要对XML文档加以约束。而DTD就是用来约束XML文档的。使其在一定的规范下使用。除了DTD技术,Schema技术也用于约束XML文档。

二、DTD文档的声明

外部文档声明
<!DOCTYPE 根元素 SYSTEM|PUBLIC "DTD文件路径">

eg:
<!DOCTYPE webapp PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

除了外部文档声明,还有内部文档声明,内外部文档声明。
内部文档声明:<!DOCTYPE 根元素 [定义内容]>
内外部文档声明:<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
对于内部文档声明,内外部文档声明,我们简单了解即可。主要还是采用外部文档声明的方式。

注意事项:
1.定义关键字一定要大写,比如DOCTYPE ELEMENT ATTLIST,此外SYSTEM PUBLIC也应该大写。
2.当引用的是本地的DTD文档时,在声明中使用SYSTEM关键字。  eg:<!DOCTYPE stu SYSTEM "test.dtd">
3.当引用的是网络上公共的DTD文档时,采用PUBLIC关键字。  eg:<!DOCTYPE webapp PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"

三、DTD元素

基本语法:<!ELEMENT NAME CONTENT>
解释:ELEMENT 关键字   NAME 元素名称  
CONTENT 元素类型,主要有以下几种,都必须大写:
1.EMPTY  ----该元素不能包含任何元素或文本,但可以有属性
2.ANY---该元素可以包含在DTD中定义的元素内容。
3.#PCDATA ---该元素不包含其他元素,只有文本内容,也就是说钙元素内部不能嵌套其他标签。用关键字#PCDATA进行定义,它代表已经编译过的字符数据。
4.子元素类型---该元素可以包含其他一系列子元素。子元素内容模型用来指定钙元素可以包含哪些子元素。
eg:<!ELEMENT stu(classID,name,age,addr)>
上面代码表示:stu元素包含classID,name,age,addr四个子元素。

根据子元素之间的关系,子元素内容模型可能有以下两种结构:
1.序列,所有子元素必须出现且只出现一次。注意事项:使用序列时,序列中不能出现#PCDATA。子元素中可以包含其他子元素。

2.选择。 eg:<!ELEMENT stu(classID|name|age|addr)>。
上述代码表示,stu的子元素只能是classID,name,age,addr中的一个,且只能有一个。


元素出现现次数指示符:
?    0次或一次
*    0次或者多次
+    至少出现一次
无符号  只能出现一次

四、XML属性定义

基本语法:<!ATTLIST 标签名 属性名 属性类型 属性说明>
解释:
属性类型可以是以下几种类型;
1.CDATA:最普通的字符串
2.枚举 即(值1|值2|值三),需要括号
3.ID:表示该属性值是唯一的。  属性值需要以字母或者下划线开头。

属性说明:
1、#REQUIRED:必须设置。
<!ATTLIST stu school (NCU|Pecking University|Wuhan University) #REQUIRED>
2.#IMPLIED:可选值,也就是说可以设置该属性的值,也可以不设置
<!ATTLIST addr CDATA #IMPLIED>
3.#FIXED:固定值.也就是说给该属性指定一个固定的值。语法格式为:#FIXED ”固定值"
<!ATTLIST stu class #FIXED "电子商务161">
4.默认值。
<!ATTLIST addr (北京|南昌|武汉) "南昌"

五、XML实体

实体:实体是用来定义普通文本快捷方式的变量。
实体分为:引用实体和参数实体
.
引用实体在XML中使用,格式为:&实体名
参数实体在DTD内部使用,格式为:%实体名


引用实体:定义格式:<!ENTITY 实体名 文本值>
eg:<!ENTITY copyright "Evil.company">

参数实体:定义格式:<!ENTITY %  实体名 文本值> 注意:定义时%与实体名之间存在空格,使用的时候不需要空格。
eg:<!ENTITY % name "HelloWorld">

猜你喜欢

转载自www.cnblogs.com/L-C98/p/9163771.html