DTD学习------从初识到理解

DTD的概念是在学习XML的过程中接触到的,虽然现在DTD已经几乎不用了,但是还是抽空来学习记录一下,希望对大家有用。

一、初识DTD

DTD(document type definition)是指文档类型定义,可以定义合法的XML文档构建模块,其可以被声明在XML文档中,也可以作为外部引用。什么意思,这里我们类比java的类和实例,DTD就像定义了一个类结构,而XML就是定义出的类的一个实例。至于为什么使用DTD,则是主要用来解决传输问题,它的存在可以使我们能够使用某个标准的DTD来 交换数据、检验数据。

下面我们举一个例子来展示DTD被包含在XML源文件内部的情况,此时它需要被包装在一个DOCTYPE声明中:

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>Rose</to>
  <from>Jake</from>
  <heading>Reminder</heading>
  <body>Let's have dinner together!</body>
</note>
其中DTD被包装在<!DOCTYPE 根元素[元素声明]>中,其中!DOCTYPE note定义了文档类型是note,!ELEMENT note(to,from,heading,body)定义了note元素的四个子元素,下面的几行分别定义了元素的类型。

接下来我们再来举一个外部引用的例子,此时它需要被包装在一个这样的<.!DOCTYPE 根元素 SYSTEM “文件名”>中:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Rose</to>
<from>Jake</from>
<heading>Reminder</heading>
<body>Let's have dinner together!</body>
</note> 
然后还必须有一个包含DTD的“note.dtd”文件:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
二、DTD构建模块

所有的XML文档均由元素、属性、实体、PCDATA、CDATA这些简单模块构建而成,关于元素、属性、实体的介绍可以移步XML部分,下面简单介绍一下PCDATA和CDATA。PCDATA是parsed character data的缩写,意思是被解析的字符数据(所谓字符数据可以理解为是开始标签与结束标签之间的文本);CDATA是character data的缩写,意思是字符数据,综合比较两者,可以看出前者是会被解析器解析的文本,文本中的标签会被当做标记去处理,实体也会被展开,而CDATA不会被解析器所解析。

三、DTD元素

1、DTD中XML元素通过下面的语法来进行声明:

<!ELEMENT 元素名称 类别>
或者
<!ELEMENT 元素名称 (元素内容)>
其中空元素通过EMPTY来进行声明。

2、中有PCDATA的元素,通过圆括号中的#PCDATA来声明:

<!ELEMENT 元素名称(#PCDATA)>
3、带有任何内容的元素,指可以包含任何可解析数据的组合:

<!ELEMENT 元素名称 ANY>
4、带有子元素的元素(必须按顺序出现):

<ELEMENT 元素名称(子元素1,子元素2...)>
5、声明只出现一次的元素(在父元素中有且仅有一次出现):

<!ELEMENT 元素名称 (子元素名称)>
eg:<!ELEMENT note(message)>,message必须出现一次,且必须只在note元素中出现一次

6、声明最少出现一次的元素:

<!ELEMENT 元素名称 (子元素名称+)>

7、声明出现零次或多次的元素:

<!ELEMENT 元素名称 (子元素名称*)>

8、声明“非.../既...”类型的内容:

eg:<!ELEMENT note(to,from,header,(message|body))>
声明了note元素必须包含to、from、header以及非message元素既body元素

9、声明混合型的内容:

eg:<!ELEMENT note(#PCDATA|to|from|header|message)*>
声明了note元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"
四、DTD属性

DTD总属性通过ATTLIST来进行声明,使用下面语法:

<!ATTLIST 元素名称 属性名称 属性类型  默认值>
例如:

DTD的实例:

<!ATTLIST payment type CDATA "check">
XML的实例:

<payment type="check"/>
关于属性类型的选项大家可以上网搜索,这里不再做赘述。

五、DTD实体

所谓DTD实体适用于定义引用普通文本或特殊字符的快捷方式的变量,实体可以在内部或者外部进行声明,下面我们分别举例:

1、一个内部实体声明,遵从语法规则为:<!ENTITY 实体名称 “实体的值”>

DTD的实例:

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright google">
XML的实例:

<author>&writer;&copyright;</author>
2、一个外部实体声明,遵从语法规则为:<!ENTITY 实体名称 SYSTEM "URI/URL">

DTD的实例:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
XML的实例:

<author>&writer;&copyright;</author>
关于DTD的内容暂时先了解到这里。






猜你喜欢

转载自blog.csdn.net/cambridgewoo/article/details/59047073
DTD
今日推荐