【转】XML中关于DTD类型(内部(SYSTEM)的和外部(PUBLIC)的区别)

[亡魂溺海] 提交于 2020-03-02 05:00:01

DTD是什么?Document Type Definition——文档类型定义。

在做自定义标签的时候,写标签库定义文件tld时,要写一大段东东:<!DOCTYPE ...... >。当时只知道拷贝、粘贴,也没有去想这是什么东西。今天才知道,这玩意儿叫DTD。是为了规范xml文档元素编写的。

DTD的语法规定,DTD的所有关键字都是大写的,如DOCTYPE,ELEMENT等,它分为两种。

1、内部DTD。注意的是在元素名后面一定要有空格,否则就不是格式良好的
<!DOCTYPE 根元素名 [
   <!ELEMENT 元素名 (元素类型定义)>
]>

如对下面这个xml文档的类型定义:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE poem [
  <!ELEMENT poem (title,author,line+)>
  <!ELEMENT title (#PCDATA)>
  <!ELEMENT author (#PCDATA)>
  <!ELEMENT line (#PCDATA)>

]>
<poem>
 <title>静夜思</title>
 <author>李白</author>
 <line>床前明月光,</line>
 <line>疑事地上霜.</line>
 <line>举头望明月,</line>
 <line>低头思故乡.</line>
</poem>

2、外部DTD
如果吧DTD放在xml文档内部,一方面会带来xml文档变大,一些程序可能不需要DTD信息;另一方面不利于DTD共用,也许会有不同的xml文档共用这个DTD。这就是外部DTD存在的原因。

定义外部DTD的语法:
<!DOCTYPE  根元素名 SYSTEM "外部DTD文件的URI">(SYSTEM表示DTD文件是私有的。引号不能少)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="simple1.css" type="text/css" ?>
<!-- 外部DTD -->
<!DOCTYPE poem SYSTEM "poem.dtd">

<poem>
 <title>静夜思</title>
 <author>李白</author>
 <line>床前明月光,</line>
 <line>疑事地上霜.</line>
 <line>举头望明月,</line>
 <line>低头思故乡.</line>
 <commet>李白是中国最伟大的诗人!</commet>
</poem>
-----------------------------相同目录下的poem.dtd内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT poem (title,author,line+,commet)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT line (#PCDATA)>
<!ELEMENT commet  (#PCDATA)>

如果想引用一个公共的DTD文档,又该如何呢?
<!DOCTYPE  根元素名 PUBLIC "DTD的名称" "外部DTD文件的URI">(PUBLIC表示DTD文件是公共的,注意在PUBLIC之后,还多了一个DTD的名称。引号不能少)
下面是taglib的DTD:
<!DOCTYPE taglib PUBLIC 
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
    "
http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
分析一下这个外部DTD声明:
1、关键字DOCTYPE,PUBLIC。
2、根元素名:taglib。所以每一个标签库定义文件都是以taglib为根元素的,否则就不会验证通过。
3、紫色的字
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN",这是公共DTD的名称。这个东西命名是有些讲究的。首先它是以"-"开头的,表示这个DTD不是一个标准组织制定的。(如果是ISO标准化组织批准的,以“ISO”开头,如果不是ISO的标准化组织批准的,以“+”开头。)。接着就是双斜杠“//”,跟着的是DTD所有者的名字,很明显这个DTD是sun公司定的。接着又是双斜杠“//”,然后跟着的是DTD描述的文档类型,可以看出这份DTD描述的是jsp 标签库1.2版本的格式。再跟着的就是“//”和ISO 639语言标识符。
4、绿色的字"
http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd",表示这个DTD的位置。
疑问:是不是xml分析器都会到java.sun.com上去找这个dtd呢?答案是否定的,xml分析器首先会以某种机制查找公共DTD的名称,查到了,则以此为标准,如果查不到,再到DTD位置上去找。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!