查看原文
其他

天天用XML,可你了解DTD吗?

IT服务圈儿 2022-09-11

The following article is from 程序员架构 Author 立体的萌

来源丨本文经授权转自程序员架构(ID:chengxuyuanjg)

作者丨立体的萌

引子

XML我们再熟悉不过了,我记得我上学的时候学习JSP时,就写过web.xml文件,学到Struts时,又写过struts-config.xml文件,以及如何用dom4j解析XML……可是我们每天都用就意味着我们很了解XML吗?别的不说,就说说XML领域中应用最广泛地三个技术:XML、XML名称空间和XSTL是怎么用的?还有XML的起源?XML与HTML又有什么区别?XML就像是一位变得熟悉而又陌生的老熟人,我们天天都跟他打交道,他天天为我们服务,然而我们真的很了解XML吗?

XML真的不是HTML的兄弟!

XML与HTML从名字上看就好像一个爹生的兄弟俩(如果按照西方的规则,姓氏放在名字后面的话),HTML的全称叫做:Hypertext Markup Language(超文本标记语言),XML的全称叫做Extensible Markup Language(可扩展标记语言),都是标记语言不假,先别急,talk is cheap,show me your code;这是一段HTML代码示例:

 这是一段XML代码示例:

从代码里就可以很清楚的看到,XML是允许使用者自定义标记的,而HTML就不能,这就是XML的可扩展性,我用一个表格来呈现一下XML与HTML之间的异同;标记语言一开始由IBM的研究人员 与上个世纪六十年代创立,成为GML(通用标记语言),当初是为了建立一种通用的文档格式来提高系统的可移植性的,后来IBM有进一步完善了GML,称为SGML(标准通用标记语言);SGML从上个世纪八十年代开始大规模应用,其主要的作用在于创建其他的标记语言,但是SGML太过于复杂,XML就是由SGML简化而来的,XML与SGML的关系好比是简体字与繁体字的关系,只是将其简化,但是功能一样不少;XML的主要作用在于做跨平台的数据交换,说到跨平台,就不得不想到java,write one ,run everywhere,其实,XML和java才是兄弟

为了更好的使用,引入语义约束

 1   DTD是什么?


DTD是为XML文档定义语义约束的,其实定义语义约束的不光有DTD,还有Schema,前者相对简单,但是能实现的功能也很有限,后者相对复杂,能实现的功能也多,颜值越高,责任越大嘛,哦,不是,应该是能力越高,责任越重;
语义约束其实就相当于我们写java时候的编译,编辑器只能帮你检查语法错误,但是你写的程序能不能实现最优那是编译器说了算,语义约束就是在格式良好的XML文档的基础上来实现“有效性”,比如:元素之间的关系、元素与属性之间的关系、属性的取值是否正确等;DTD具体能做什么我通过一张表格来呈现

那么,通过使用DTD,可以让每个XML文件自带一个有关其自身格式的描述,同时如果项目很大的话,不同的组织也可以使用同一个标准的DTD来交换数据,也方便了应用程序或者是程序员对XML语义约束的检查;

 2    DTD文档的结构


与其说是结构 不如说是构成

在这里一定要注意,DTD只是为XML定义语义约束的文档,DTD的语法非常简单

一.元素类型声明

一个XML元素可以为空,也可以只包含字符数据,并且可以有若干个子元素子元素下面也可以由自己的子元素,有点类似于树结构了;元素类型说明主要是以下五种:第一个,#PCDATA说明元素包含字符数据

第二个,子元素把上面的例子稍作更改如果说元素student还有两个最元素:number、name,该怎么做呢?

如果说又增加了一个元素:sex,非男即女的选项只能选一个,那么这里就要用到“或”:|

如果说又增加了一个元素:course,一位学生可以选很多课程,这时就可以用*,*表示大于等于0;

*有个弊端就是可以等于零,但是逃课是不行的,必须至少学一门,那么这就要用到加号:+

如果现在又增加一个元素:question,学生可能提问了也可能没有提问,后面加一个问号:?就可以解决问题;

第三个,混合内容表示元素既可以包含字符数据,也可以包含子元素,混合内容在使用时被定义为零个或者多个;

第四个,ANY表示元素 可以字符数据或者是子元素,这种的含糊不清,尽量不要使用

第五个,EMPTY表示元素既不包含字符数据也不包含子元素

二. 实体声明第一个,一般实体

第二个,参数实体

三.属性表声明

关键字#REQUIRED,说明必须为元素提供该属性关键字#IMPLIED,说明元素可以包含该属性也可以不包含该属性关键字#FIXED+默认值,说明一个固定的默认值或者是只有默认值四.记号声明第一种,MIME类型

第二种,使用URI路径

如何使用DTD

第一种:直接在文档中声明DTD,也叫内部DTD

大写的是关键字,因为DTD规定关键字必须是大写,其他的,比如:在DTD中定义的元素和属性大小无所谓,但并不是要你为所欲为,这就跟java的变量命名一样,之前命名的什么,后面用的时候也写什么,XML文档是区分大小写的,所以一定要从头到尾保持一致;这个方式有什么好处呢?比较直观,修改起来也非常的方便,而且XML处理器(可以读取和处理任何XML文档的任何程序就称为XML处理器)寻找起来也很快捷;那这个方式又有什么坏处呢?最明显的就是增加了文档的长度但这不是最坏的情况,最坏的情况是如果XML文档少了还好,多了就得每个XML文档都增加上,相当繁琐,效率就不说了,还很容易出错;于是为了弥补第一种的不足,就出现了第二种方式:在外部定义DTD,然后需要的时候再通过URI去引用,这个方式有点类似于java的封装的思想,常用的函数就直接封装到一个类里面,需要的时候直接新建这个类的对象调用相应的函数就好;如何指出外部DTD文件的位置呢?这就要用到SYSTEM关键字,SYSTEM关键字表示的是文档使用的是私有的DTD文件;

“外部DTD文件的URI”有个专有的名称叫做系统标识符,URI既可以是绝对的也可以是相对的;假如有个文件已经存放了所有的DTD的定义,叫做hello.dtd(此文件必须和XML文档在同一个目录)或者是

URI是我瞎编的,明白意思就好;如果引用DTD的XML文档与DTD文件在同一个WEB服务器上,我们就可以使用相对URL

或者是

还可以更加简化一点

如果是声明公共的DTD,就要使用另一个关键字:PUBLIC

这里的“DTD的名称”也有个专有名称,叫做:公共标识符,也就是说这个DTD是可以存放在某个公共的地方,由XML处理器按照名字来进行检索,如果按名访问找不到再使用系统标识符;

总结

以上就是XML中非常常见的DTD技术,以及区分了XML与HTML,我在学习的时候发现XML和HTML非常像,后来随着学习的深入,发现根本就不是一回事,了解了DTD技术,我们就能对XML的语义约束有了更深入的理解

关于作者:

笔名立体的萌,是个工作还不到一年就辞职考研的的菜鸟,上学学习的是java,但是工作用的是C#,C#用途远远没有java范围广,再加上java是我的母语,所以很像回归java,不仅仅是提升技术能力,也有往大数据等高端领域发展的想法。请作者吃糖

本文作者:立体的萌 

个人网址:https://blog.csdn.net/weixin_46107282

声明:本文为 程序员架构 原创投稿,未经允许请勿转载。


1、非常牛逼的浏览器插件,你值得拥有!

2、微信和QQ,这次终于可以互通了

3、12.8k Star!“神奇虫洞”,一条命令就能安全传送文件

4、又来了!10分钟实现微信 “炸屎”大作战

点分享

点点赞

点在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存