xsd,dtd,tld有什么区别和联系?

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

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 声明中:

   <!DOCTYPE 根元素 [元素声明]>  

  带有 DTD 的 XML 文档实例  

<?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>

以上 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" 类型

再举一个例子:

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

文档类型声明由<! 开始,后面紧跟一个关键字DOCTYPE,然后是文档根元素的名称,接下来是标记生命块,标记声明块是放在左中括号 [ 和右中括号 ] 之间的,由一个或者多个标记声明构成,最后由> 结束。
在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 定义中:
<!DOCTYPE 根元素 SYSTEM "外部DTD文件的URI">   
SYSTEM关键字表示文档使用的是私有的DTD文件,“外部DTD文件的URI”可以是相对URI或者绝对URI,相对URI是相对文档类型声明所在文档的位置。
比如

<!DOCTYPE greeting SYSTEM "hello.dtd">

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

 http://www.guowuxin.org/xml/hello.dtd

我们可以在文档类型声明中使用此URI

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

如果是一种企业或者行业领域标准,则不建议使用SYSTEM,而是使用public修饰
<!DOCTYPE 根元素的名字 PUBLIC “DTD的名称” “外部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”


 

下面这个 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>  


 这是包含 DTD 的 "note.dtd" 文件:  

<!ELEMENT note (to,from,heading,body)>  
<!ELEMENT to (#PCDATA)>   
<!ELEMENT from (#PCDATA)>  
<!ELEMENT heading (#PCDATA)>  
<!ELEMENT body (#PCDATA)> 

 

通过 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 root[   <!-- 子元素 --> ]>  

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

转载于:https://my.oschina.net/u/2381372/blog/2050120

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值