DTD XSD TLD 区别

作者:wuxinliulei
链接:https://www.zhihu.com/question/38843167/answer/78782017
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1. 简介

      DTD(Document Type Definition)和XSD(XML Schemas Definition)是XML文档的描述文件,用于检验XML文档格式的正确性。
      TLD(taglib description)是JSP的标签库描述文件。如要在JSP页面中实现JSP标签,必须首先定义实现标签的类,然后在标签库描述文件(TLD)中将写好的类映射成jsp标签,最后在JSP文件中使用定义好的标签,就可以生成动态的JSP内容。

1.1 DTD

      DTD(Document Type Definition) 是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分。DTD 是一种保证XML文档格式正确的有效方法,可通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。XML文件提供应用程序一个 数据交换的格式,DTD正是让XML文件能成为数据交换标准,因为不同的公司只需定义好标准DTD,各公司都能依DTD建立XML文件,并且进行验证,如 此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。DTD文件是一个ASCII文本文件,后缀名为.dtd。

1.2 为什么需要dtd,xsd 这种xml文档定义描述?

            对于一个格式良好的XML文档,我们只能保证这个文档的格式符合XML规范,但是元素与元素之间的关系、元素与属性的关系,属性的取值是否正确,我们就无法得知了。对于一个格式良好的文档,如果仅仅是在有限的应用中使用,或者作为数据的存储传输,那么也能很好的满足我们的应用。但是如果要让其他用户理解你的XML文档,或者和其他的应用进行数据交换,那么就有必要提供一种机制,来保证我们所写的XML文档和别人所写的XML文档其结构是相同的,元素与元素之间的关系是正确的,属性的取值也是符合要求的。

1.3在XML当中引入DTD有哪些方式?

            我们可以直接在XML文档中定义DTD,也可以通过URI引用外部的DTD文件,或者同时采用这两种方式。
                 ①XML文档中内部定义DTD,内部的 DOCTYPE 声明,通过下面的语法包装在一个 DOCTYPE 声明中: <!DOCTYPE 根元素 [元素声明]> 带有 DTD 的 XML 文档实例:

DEMO1
<?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>Tove</to>   
     <from>Jani</from>  
    <heading>Reminder</heading>  
    <body>Don't forget me this weekend</body>  
</note>
解读:

      1. !DOCTYPE note (第二行)定义此文档是 note 类型的文档。  
      2. !ELEMENT note (第三行)定义 note 元素有四个元素:“to、from、heading,、body”  
      3. !ELEMENT to (第四行)定义 to 元素为 “#PCDATA” 类型   
      4. !ELEMENT from (第五行)定义 from 元素为 “#PCDATA” 类型  
      5. !ELEMENT heading (第六行)定义 heading 元素为 “#PCDATA” 类型
      6. !ELEMENT body (第七行)定义 body 元素为 “#PCDATA” 类型

DEMO2:
<?xml version="1.0" encoding="gb2312" standalone="yes">
<!DOCTYPE greeting [
   <!ELEMENT greeting (#PCDATA)>
 ]>  
解读:

      1. 文档类型声明由<! 开始,后面紧跟一个关键字DOCTYPE;
      2. 然后是文档根元素的名称;
      3. 接下来是标记生命块,标记声明块是放在左中括号 [ 和右中括号 ] 之间的,由一个或者多个标记声明构成,最后由> 结束。

注意:

     在DTD当中,所有关键字都是大写的,如ELEMENT、#PCDATA一样;不过在DTD中定义的元素和属性的大小写是可以任意指定的。
     但是,XML文档是大小写相关的,所以一旦给一个元素命名了,那么整个文档中都要使用相同的大小写。例如:greeting 和Greeting是两个不同的元素名。

1.4XML文档中定义DTD

优点:

     比较直观,修改也比较方便,而且不用担心XML处理器找不到DTD。

缺点:

      1. 在文档中定义DTD会导致文档本身的长度增加,在传输数据市,即使不需要验证文档的有效性,这些声明也会随文档一起传输。
      2. 如果多个XML文档需要共用一个DTD,我们就需要在每个文档中加入DTD,这是相当繁琐的。

解决方案

      将dtd放到一个单独的文件中去定义,在XML文档中,通过URI外部引用(有没有发现写程序的时候的#include 和import也有同样的功效重用代码)——外部文档声明

XML引用DTD

      <!DOCTYPE 根元素 SYSTEM "外部DTD文件的URI">

引用解读

      1. SYSTEM关键字表示文档使用的是私有的DTD文件;
      2. “外部DTD文件的URI”可以是相对URI或者绝对URI,相对URI是相对文档类型声明所在文档的位置。比如:

<!DOCTYPE greeting SYSTEM "hello.dtd">

     我们将DTD的定义放到了hello.dtd文件中,注意要将hello.dtd放在和XML文档同一目录下,这样XML处理器才能找到这个文件。
      3. 在给DTD文件取名字的时候,文件名可以随便取,但扩展名一般为.dtd;
      4. 如果位于不同位置的多个XML文档要使用同一个DTD,我们可以使用绝对URI来指明DTD文件的地址。假定hello.dtd位于 http://www.guowuxin.org/xml/hello.dtd,我们可以在文档类型声明中使用此URI:

<!DOCTYPE greeting SYSTEM "http://www.guowuxin.org/xml/hello.dtd">

      5. 如果是一种企业或者行业领域标准,则不建议使用SYSTEM,而是使用public修饰:

<!DOCTYPE 根元素的名字 PUBLICDTD的名称” “外部DTD文件的URI>

      PUBLIC关键字用于声明公共的DTD,并且这个DTD还有一个名称,“DTD的名称” 也称为公共标识符:

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

比如上面是servlet2.3中web.xml的DTD根元素web-app

PUBILC "-//所有者//DTD文档描述的类型//ISO639语言标识符" “外部DTD文件URI
DEMO1 修改版

下面这个 XML 文档和上面的第一个 XML 文档相同,但是拥有一个外部的 DTD:

<?xml version="1.0"?>  
<!DOCTYPE note SYSTEM "note.dtd">
<note>  
  <to>Tove</to>  
  <from>Jani</from>  
  <heading>Reminder</heading>  
  <body>Don't forget me this weekend!</body>  
</note>  
“note.dtd” 文件:
<!ELEMENT note (to,from,heading,body)>  
<!ELEMENT to (#PCDATA)>   
<!ELEMENT from (#PCDATA)>  
<!ELEMENT heading (#PCDATA)>  
<!ELEMENT body (#PCDATA)>

DTD优势:

      1. 每一个XML文档都可携带一个DTD,用来对该文档格式进行描述,测试该文档是否为有效的XML文档。
      2. 独立的团体可一致地使用某个标准的 DTD 来交换数据。
      3. 应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
      4. 在应用程序中也可以用某个DTD来检测接收到的数据是否符合某个标准。

DTD缺陷:

      1. DTD有自己的特殊语法,其本身不是XML文档;
      2. DTD只提供了有限的数据类型,用户无法自定义类型;      3. DTD不支持域名机制。

总结

     1. 对于XML文档而言,虽然DTD不是必须的,但它为文档的编制带来了方便。加强了文档标记内参数的一致性,使XML语法分析器能够确认文档。如果不使用DTD来对XML文档进行定义,那么XML语法分析器将无法对该文档进行确认。
      2. 每个XML文档都只有一个根元素,其它的子元素都包含在该根元素中。因此在DTD中对根元素的声明是必不可少的。元素声明的一般形式如下:

<!DOCTYPE root[   <!-- 子元素 --> ]>  
最后

      servlet标准在2.5开始就放弃使用dtd,改用了xsd。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值