XML —— DTD介绍

一、DTD介绍

 

Document Type Definition;

        DTD是一种XML的约束方式,除了此种约束方式外,还有XSchema,XSchema比DTD的约束能力还要强,因此DTD正在逐渐淘汰;

        DTD的目的就是约束XML标签的写法;比如在我们struts2开发当中,编写struts.xml时,需要遵循的规则,就是通过DTD进行约束的,因此我们在开发当中通过Eclipse导入DTD文件,便于开发提示,如果在开发中开发人员不遵循DTD的规范,则会出现错误提示;

<struts><package name="" namespace="" extends=""><action></action>    </package></struts>

        XML约束的重要性:在编写XML时,对于XML进行约束是非常重要的,因为如果对于XML不约束,则会让开发人员很难掌握;

        而DTD通常是由框架设计人员定义的,一般的开发人员只需要在XML中遵循DTD规范编写XML即可;

二、导入DTD

        如果要导入DTD,可以通过两种方式:

        (1)在XML中直接编写;

        (2)在专门的DTD文件中编写,然后在XML中通过特定的语句导入DTD文件;

        1、在XML中直接编写,语法如下:

       [html] view plaincopy
  1. <!DOCTYPE 根节点[  
  2.     .........  
  3. ]> 

         2.XML文件中导入DTD文件

 

        此种方式需要考虑两个情况:

  (1)如果是本地文件,则:

        [html] view plaincopy
  1.      <!DOCTYPE 根节点 SYSTEM "dtd的URL">  

           此处的URL指的是比如 "F:\1.dtd"

  (2)如果是共享文件,则:

[html] view plaincopy
  1. <!DOCTYPE 根节点 PUBLIC "dtd名称" "dtd的URL">  


三、DTD语法

 

在DTD中可以定义XML标签的顺序、个数,属性的值,实体;

 

1.XML元素定义

 

语法如下:

<!ELEMENT 元素名称 元素类型>        //定义元素的类型,但是只能是 ANY(表示任意类型)或EMPTY(空元素);

<!ELEMENT 元素名称 (元素内容)>    //定义元素的内容,一定要加上();

 

对于元素内容

----可以定义子元素的名称,比如:

<!ELEMENT 元素名称 (子元素1,子元素2,子元素3)> 表示3个子元素只能出现一次,并且按照此顺序出现;

<!ELEMENT 元素名称 (子元素1|子元素2|子元素3)> 表示3个子元素中只能出现一个;

我们还可以定义子元素的个数,比如:

(1)+:1次或多次;比如 (name+)表示此name元素只能出现1次或多次。

(2)?:0次或1次;比如(name?)表示此name元素只能出现0次或1次。

(3)*:0次或多次;比如(name*)表示此name元素任意出现几次。

(4)无:只能一次;比如(name)表示此name元素只能出现1次。

对于元素内容,

----也可以定义子元素内容的类型,比如#PCDATA,表示字符串;

 

 

举例:

[html] view plaincopy
  1. <!DOCTYPE personlist [    <!-- 根节点为personlist-->  
  2. <!ELEMENT personlist (person+)>    <!-- personlist的子元素为person,并且可以出现1次或多次-->  
  3. <!ELEMENT person (name,age,salary)>    <!-- person的子元素是name,age,salary,并且可以出现一次,并且出现顺序以此顺序为准-->  
  4. <!ELEMENT name ANY>    <!--name可以使任意类型 -->  
  5. <!ELEMENT age (#PCDATA)>    <!-- age可以是字符串-->  
  6. <!ELEMENT salary (#PCDATA)>    <!-- salary可以是字符串-->  
  7. ]>  
  8.    

从以上可以看出,DTD不可以定义数字等类型,此为DTD的缺陷;

 

2.XML属性定义

 

语法如下:

<!ATTLIST 标签名

    属性名1        属性类型        属性说明

    属性名2        属性类型        属性说明

>

属性类型可以是

(1)CDATA:最普通的字符串;

(2)枚举,即(值1|值2|值3),需要括号

(3)ID:属性值需要以字母或下划线开头;

属性说明可以是:

(1)#REQUIRED:必须设置;

(2)#IMPLED:可选值,即此属性可以设置,也可以不设置;

(3)#FIXED:固定值,通常语法为:#FIXED  "固定值"

(4)默认值;

 

   举例:

[html] view plaincopy
  1. <!DOCTYPE personlist [  
  2.    
  3. <!ELEMENT personlist (person+)>  
  4. <!ELEMENT person (name,age,salary)>  
  5. <!ELEMENT name ANY>  
  6. <!ELEMENT age (#PCDATA)>  
  7. <!ELEMENT salary (#PCDATA)>  
  8. <!ATTLIST person  
  9. aaa CDATA #REQUIRED        <!-- -->  
  10. bbb CDATA #IMPLIED         <!-- 可选属性-->  
  11. ccc CDATA #FIXED "xiazdong" <!--固定值,不需要设置 -->  
  12. ddd CDATA "XZDONG"         <!--默认值为"XZDONG", 可以自己设置 -->  
  13. eee ID #REQUIRED             <!--ID -->  
  14. fff (1|2|3) "1"                         <!--枚举值,默认为1 -->  
  15. >  
  16. ]>  


 

3、XML实体定义

 

实体类似于一个可重用常量,或者说是ant中的classpath,可以被引用;

语法如下:

<!ENTITY 实体名称  "实体内容">

引用实体语法:
&实体名称;    注意:最后的“;”一定需要;

 

注意:引用实体必须在XML中引用;

 

举例:

[html] view plaincopy
  1. <!DOCTYPE personlist [  
  2.    
  3. <!ENTITY constant "aaaa">  
  4. <!ELEMENT personlist (person+)>  
  5. <!ELEMENT person (name,age,salary)>  
  6. <!ELEMENT name ANY>  
  7. <!ELEMENT age (#PCDATA)>  
  8. <!ELEMENT salary (#PCDATA)>  
  9.    
  10. ]>  
  11. <personlist>  
  12. <person >  
  13. <name>&constant;</name>        <!-- 引用constant实体-->  
  14. <age>aaa</age>  
  15. <salary>aaa</salary>  
  16. </person>  
  17. </personlist>  
  18.    


小知识点:根据XML自动生成DTD

因为一般我们写的XML基本都是没有DTD的,如果要自己写DTD,又很麻烦,因此我们可以通过工具来自动生成:trang

功能:能够完成如下转换:

(1)XML ---> DTD

(2)XML --->XSchema

(3)DTD--->XSchema


使用方法:

java -jar trang.jar -I xml -O dtd input.xml output.dtd 即可;

-I xml 表示输入为xml;

-O dtd表示输出为dtd文件;

input.xml表示输入文件;

output.dtd表示输出文件;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

更新的软件可以解决 TortoiseGit-preview-2.5.7.0-20180127-b2d00f8-64bit.msi和Git-2.16.2-64-bit.exe。 链接地址为&#xff1a; https://github.com/git-for-windows/git/releases/download/v2.16.2.windows.1/Git-2.16.2-64-bit.exe https://download.tortoisegit.org/tgi…

Linux 图片传输功能c/c++(初版)

由于深度学习任务的需要&#xff0c;要在程序里面嵌入一个module。 这个module 的功能是接收来自ios客户端的图片。并且传送给深度学习分类器进行处理。 于是看了看各种各样的 module 实现方案。 先是用IO函数把图片以数组的方式存起来。 再和服务器建立连接&#xff0c;socket…

Val编程-val系列编程思想

利用Val语言可以编写出各种各样的应用程序。正如windows phone面临的窘境一样&#xff0c;受众太小&#xff0c;市场不大。应用程序不多&#xff0c;所以也谈不上成熟。国内的应用程序基本上就是简单的小程序&#xff0c;谈不上什么编程思想。国外许多都是基于kernel的而衍生出…

Celery的实践指南

Celery的实践指南celery原理&#xff1a;celery实际上是实现了一个典型的生产者-消费者模型的消息处理/任务调度统&#xff0c;消费者(worker)和生产者(client)都可以有任意个&#xff0c;他们通过消息系统&#xff08;broker&#xff09;来通信。典型的场景为&#xff1a;客户…

【pyqt5学习】——bug修复,利用qt资源库qrc文件进行背景图像设置,不显示图像

目录 bug描述 bug分析 bug解决 bug描述 利用下面文章的方法进行资源设置后&#xff0c;有的显示了有的没有显示 【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写_有情怀的机械男的博客-CSDN博客_python qrc目录一、说明二、安装pyqt5以及相关工具&#xff08;pyqt5、pyuic…

Datalore:用于机器学习可视化的新Web方案!

前不久&#xff0c;JetBrains团队发布了Datalore&#xff0c;这是一款基于云的web应用程序&#xff0c;用于构建机器学习模型并在Python中创建丰富的可视化。最新的测试版本旨在简化构建机器学习模型的流程&#xff0c;并帮助开发人员进行数据分析。由于Datalore的智能编码辅助…

Val3语言介绍

Val3语言是一门专门针对特定工业机器人的一门语言。在墙内有关这方面的介绍非常的少。在墙外维基百科上有一篇详细介绍的,有空FQ摘抄在这里。 Val3是使用XML格式。可以使用XML编辑器来进行编写VAL3的程序&#xff0c;可直接在模拟器上或者示教盒上编程&#xff0c;一般推荐使用…

网络层相关问题

1.说一下网络层的总体结构。 2.有没有看过源码&#xff1f; A.继承Request   B.打日志   C.修改参数 3.说一下Volley整体结构。 4.有了解过OkHttp吗&#xff1f; 5.说一下OkHttp和Volley的区别&#xff1f;转载于:https://www.cnblogs.com/jarvisyin/p/6389553.html

CSS魔法堂:重拾Border之——图片作边框

前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊&#xff0c;一想到终于不用再添加额外元素来模拟圆角了&#xff0c;但发现border-radius还分水平半径和垂直半径&#xff0c;然后又发现border-top-left/right-radius的水平半径之和大于元素宽度时&#xff0c;实际值会…

共享内存简介和mmap 函数

一、共享内存简介 共享内存区是最快的IPC形式&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 即每个进程地址空间都有一个共享存储器的映射区&#xff0c;当这块区域都映射到相同的真正的物理地址空…

【pyqt5学习】——QToolTip,QLabel控件,伙伴关系

目录 0、学习资源 1、给控件设置提示信息——QToolTip 2、QLabel控件&#xff08;显示图像、设置超链接、信号绑定&#xff09; 3、QLabel伙伴关系 1&#xff09;代码 2&#xff09;效果 3&#xff09;知识点addWidget 0、学习资源 PyQt5教程&#xff0c;来自网易云课堂…

Hello IT

从高中的计算机课开始学习如何按下开机键&#xff0c;如何上网&#xff0c;如何背诵五笔字根&#xff0c;再到大学中如何使用office,利用C编码做算法&#xff0c;到现在IT中的伪一员&#xff0c;时间算起来也不短&#xff0c;然正在入门是在2010年8月杭州参加嵌入式培训&#x…

ARM指令集2

ARM指令集2 ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据&#xff0c;加载指令用于将存储器中的数据传送到寄存器&#xff0c;存储指令则完成相反的操作。 LDR指令&#xff08;与MOV有区别&#xff0c;MOV只能操作通用寄存器&#xff09; LDR指令格式为&…

SylixOS中select原理及使用分析

2019独角兽企业重金招聘Python工程师标准>>> 1. select接口简介 1.1 select接口使用用例 select是操作系统多路I/O复用技术实现的方式之一。 多路I/O复用技术大致使用场景为&#xff1a;构造一张感兴趣的文件描述符列表&#xff0c;然后调用多路复用的IO接口&#x…

【pyqt5学习】——QLineEdit学习(回显模式)

目录 1、回显模式 2、成果显示 3、知识点 1&#xff09;FormLayout布局添加addRow方法 2&#xff09;在输入框显示灰色提示字体&#xff0c;输入内容时消失setPlaceholderText 3&#xff09;设置回显模式setEchoMode 4、完整代码 1、回显模式 QLineEdit控件的主要功能是输…

有关机械手臂控制中的两个重要输入参数

1.在机械手臂中有两个重要参数。一个是编码器的值&#xff0c;另外一个是马达的电流值。根据这两个可以获得机械手臂的运动学&#xff0c;动力学的一些数据。第一重要特征参数 是DH参数&#xff0c;另外一个就是每个轴的质心参数。

MySQL的权限分配

MySQL 赋予用户权限命令的简单格式可概括为&#xff1a;grant 权限 on 数据库对象 to 用户&#xff0c;如 GRANT PRIVILEGES ON datebase.* to user% IDENTIFIED by passwd;一、给表数据赋权 grant 普通数据用户&#xff0c;查询、插入、更新、删除 数据库中所有表数据的权利。…

用HttpURLConnection发送http请求

//发送http请求try {//1.使用网址构造一个URL对象 URL url new URL(path);//2.获取连接对象 HttpURLConnection conn (HttpURLConnection) url.openConnection();//3.设置一些属性 //设置请求方式&#xff0c;注意大写conn.setRequestMethod("GET");//设置请求超时…

【pyqt5学习】——QLineEdit控件输入校验器Validator、掩码setInputMask限制输入、textChanged信号

目录 1、输入校验器——限制输入框输入的内容 1&#xff09;校验器类型——整数、浮点数、数字字母结合&#xff08;正则&#xff09; 2&#xff09;步骤 3&#xff09;结果 ​编辑 ​编辑 4&#xff09;完整代码 2、利用掩码进行输入的限制 0&#xff09;掩码对照表 1…

Call requires API level 3 (current min is 1)

结果出现“Call requires API level 3 (current min is 1): 解决方法&#xff1a; 在工程上点击右键 -> Android Tools -> Clear Lint Markers&#xff0c;即可。转载于:https://www.cnblogs.com/qianyukun/p/5458331.html