xsd,dtd,tld有什么区别和联系?
DTD(Document Type Definition)和XSD(XML Schemas Definition)是XML文档的描述文件,用于检验XML文档格式的正确性。
TLD(taglib description)是JSP的标签库描述文件。如要在JSP页面中实现JSP标签,必须首先定义实现标签的类,然后在标签库描述文件(TLD)中将写好的类映射成jsp标签,最后在JSP文件中使用定义好的标签,就可以生成动态的JSP内容。
---------------------------------------------------------
DTD(Document Type Definition) 是一套关于标记符的语法规则。
它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分。DTD 是一种保证XML文档格式正确的有效方法,可通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。XML文件提供应用程序一个 数据交换的格式,DTD正是让XML文件能成为数据交换标准,因为不同的公司只需定义好标准DTD,各公司都能依DTD建立XML文件,并且进行验证,如 此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。DTD文件是一个ASCII文本文件,后缀名为.dtd。
1)为什么需要dtd,xsd 这种xml文档定义描述?
对于一个格式良好的XML文档,我们只能保证这个文档的格式符合XML规范,但是元素与元素之间的关系、元素与属性的关系,属性的取值是否正确,我们就无法得知了。对于一个格式良好的文档,如果仅仅是在有限的应用中使用,或者作为数据的存储传输,那么也能很好的满足我们的应用。但是如果要让其他用户理解你的XML文档,或者和其他的应用进行数据交换,那么就有必要提供一种机制,来保证我们所写的XML文档和别人所写的XML文档其结构是相同的,元素与元素之间的关系是正确的,属性的取值也是符合要求的。
2)在XML当中引入DTD有哪些方式?
我们可以直接在XML文档中定义DTD,也可以通过URI引用外部的DTD文件,或者同时采用这两种方式。
①XML文档中内部定义DTD
内部的 DOCTYPE 声明,通过下面的语法包装在一个 DOCTYPE 声明中:
带有 DTD 的 XML 文档实例
以上 DTD 解释如下:
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "PCDATA" 类型
!ELEMENT from (第五行)定义 from 元素为 "PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "PCDATA" 类型
再举一个例子:
文档类型声明由 结束。
在DTD当中,所有关键字都是大写的,就像在这里看到的ELEMENT、PCDATA一样,在后面我们还会看到其他的关键字。不过在DTD中定义的元素和属性的大小写是可以任意指定的,但是要注意,XML文档是大小写相关的,所以一旦给一个元素命名吗,那么整个文档中都要使用相同的大小写。例如:greeting 和Greeting是两个不同的元素名。
在XML文档中定义DTD,比较直观,修改也比较方便,而且不用担心XML处理器找不到DTD,但是它也有一些缺点:
1.在文档中定义DTD会导致文档本身的长度增加,在传输数据市,即使不需要验证文档的有效性,这些声明也会随文档一起传输。
2.如果多个XML文档需要共用一个DTD,我们就需要在每个文档中加入DTD,这是相当繁琐的。
要解决上面两个问题,我们将dtd放到一个单独的文件中去定义,在XML文档中,通过URI外部引用
(有没有发现写程序的时候的include 和import也有同样的功效重用代码)
② 外部文档声明
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
SYSTEM关键字表示文档使用的是私有的DTD文件,外部DTD文件的URI可以是相对URI或者绝对URI,相对URI是相对文档类型声明所在文档的位置。
比如
我们将DTD的定义放到了hello.dtd文件中,注意要将hello.dtd放在和XML文档同一目录下,这样XML处理器才能找到这个文件。在给DTD文件取名字的时候,文件名可以随便取,但扩展名一般为.dtd
如果位于不同位置的多个XML文档要使用同一个DTD,我们可以使用绝对URI来指明DTD文件的地址。假定hello.dtd位于
我们可以在文档类型声明中使用此URI
如果是一种企业或者行业领域标准,则不建议使用SYSTEM,而是使用public修饰
PUBLIC关键字用于声明公共的DTD,并且这个DTD还有一个名称,DTD的名称 也称为公共标识符
比如上面是servlet2.3中web.xml的DTD
根元素web-app
下面这个 XML 文档和上面的第一个 XML 文档相同,但是拥有一个外部的 DTD:
这是包含 DTD 的 "note.dtd" 文件:
通过 DTD,每一个 XML 文件均可携带一个有关其自身格式的描述,独立的团体可一致地使用某个标准的 DTD 来交换数据。应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
还可以使用 DTD 来验证自身的数据。
3)DTD的优势
每一个XML文档都可携带一个DTD,用来对该文档格式进行描述,测试该文档是否为有效的XML文档。
既然DTD有外部和内部之分,当然就可以为某个独 立的团体定义一个公用的外部DTD,那么多个XML文档就都可以共享使用该DTD,使得数据交换更为有效。甚至在某些文档中还可以使内部DTD和外部 DTD相结合。
在应用程序中也可以用某个DTD来检测接收到的数据是否符合某个标准。
对于XML文档而言,虽然DTD不是必须的,但它为文档的编制带来了方便。加强了文档标记内参数的一致性,使XML语法分析器能够确认文档。
如果不使用DTD来对XML文档进行定义,那么XML语法分析器将无法对该文档进行确认。
每个XML文档都只有一个根元素,其它的子元素都包含在该根元素中。
因此在DTD中对根元素的声明是必不可少的。
元素声明的一般形式如下:
DOCTYPE是document type(文档类型)的简写,DOCTYPE声明必须放在文档最顶部,在所有代码和标识之上,DOCTYPE声明是必不可少的关键组成部分。DTD语法 要求DOCTYPE必须要大写,而且DOCTYPE和元素之间必须要有空格隔开,如在以上代码中DOCTYPE和根元素root之间要有空格隔开。
4)DTD的缺陷 :利用DTD验证有效性的解析器,就能够立即对文档的完整性进行可靠的检查。DTD虽然比较实用,但DTD也有不少的缺陷。
1):DTD有自己的特殊语法,其本身不是XML文档;
2):DTD只提供了有限的数据类型,用户无法自定义类型;
3):DTD不支持域名机制。
servlet标准在2.5开始就放弃使用dtd,改用了xsd
------------------------------------------------------------
注明:本文章来源于互联网,如侵权请联系客服删除!