DTD(文档类型定义)

一、简介

为什么使用DTD

通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。

通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。

而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。

您还可以使用 DTD 来验证您自身的数据。

外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中: <!DOCTYPE 根元素 SYSTEM "文件名">

二、DTD——XML构建模块

XML 文档构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

元素 属性 实体 PCDATA CDATA

三、元素

1、在 DTD 中,XML 元素通过元素声明来进行声明。

元素声明使用下面的语法:    

<!ELEMENT 元素名称 类别>

或者    

<!ELEMENT 元素名称 (元素内容)>

2、空元素

空元素通过类别关键词EMPTY进行声明:

<!ELEMENT 元素名称 EMPTY>

例子: <!ELEMENT br EMPTY>

3、只有 PCDATA 的元素

只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:

<!ELEMENT 元素名称 (#PCDATA)>

例子: <!ELEMENT from (#PCDATA)>

4、带有任何内容的元素

通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

<!ELEMENT 元素名称 ANY>

例子: <!ELEMENT note ANY>

5、带有子元素(序列)的元素

带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:

<!ELEMENT 元素名称 (子元素名称 1)>

或者 <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

例子: <!ELEMENT note (to,from,heading,body)>

当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note" 元素的完整声明是:

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

<!ELEMENT to      (#PCDATA)>

<!ELEMENT from    (#PCDATA)>

<!ELEMENT heading (#PCDATA)>

<!ELEMENT body    (#PCDATA)>

6、声明只出现一次的元素

<!ELEMENT 元素名称 (子元素名称)>

例子: <!ELEMENT note (message)>    

上面的例子声明了:message 子元素必须出现一次,并且必须只在 "note" 元素中出现一次。

7、声明最少出现一次的元素

<!ELEMENT 元素名称 (子元素名称+)>

例子: <!ELEMENT note (message+)>

上面的例子中的加号声明了:message 子元素必须在 "note" 元素内出现至少一次。

8、声明出现零次或多次的元素

<!ELEMENT 元素名称 (子元素名称*)>

例子: <!ELEMENT note (message*)>

上面的例子中的星号声明了:子元素 message 可在 "note" 元素内出现零次或多次。

9、声明“非.../既...”类型的内容

例子: <!ELEMENT note (to,from,header,(message|body))>

上面的例子声明了:“note” 元素必须包含 “to” 元素、“from” 元素、“header” 元素,以及“message” 元素或者"body" 元素。

10、声明混合型的内容

例子: <!ELEMENT note (#PCDATA|to|from|header|message)*>

上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。

四、属性    

属性声明使用下列语法:    

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

DTD 实例: <!ATTLIST payment type CDATA "check">

XML 实例: <payment type="check" />

#IMPLIED

语法 <!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>

例子 DTD: <!ATTLIST contact fax CDATA #IMPLIED>

合法的 XML: <contact fax="555-667788" />

合法的 XML: <contact />

假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词 #IMPLIED。

#REQUIRED

语法 <!ATTLIST 元素名称 属性名称 属性类型 #REQUIRED>

例子 DTD: <!ATTLIST person number CDATA #REQUIRED>

合法的 XML: <person number="5677" />

非法的 XML: <person />

假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词 #REQUIRED。

#FIXED

语法 <!ATTLIST 元素名称 属性名称 属性类型 #FIXED "value">

例子 DTD: <!ATTLIST sender company CDATA #FIXED "Microsoft">

合法的 XML: <sender company="Microsoft" />

非法的 XML: <sender company="W3School" />

如果您希望属性拥有固定的值,并不允许作者改变这个值, 请使用 #FIXED 关键词。如果作者使用了不同的值, XML 解析器会返回错误。

五、实体

实体声明: 一个内部实体声明

语法: <!ENTITY 实体名称 "实体的值">

例子:

DTD 例子: <!ENTITY writer "Bill Gates"> <!ENTITY copyright "Copyright W3School.com.cn">

XML 例子: <author>&writer;&copyright;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

实体声明: 一个外部实体声明

语法: <!ENTITY 实体名称 SYSTEM "URI/URL">

例子:

DTD 例子: <!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子: <author>&writer;&copyright;</author>

六、XML Scema

为了克服DTD的局限性,人们提出了XML Schema即XML模式。XML模式是被开发用来替代DTD,用来定义XML文档的结构、内容和语义手段。                

Schema:Schema从字面意义上来说,可以翻译成模式、大纲、计划、规划等等。它的基本意思就是说为XML文档制定一种模式 。

 Schema相对于DTD的明显好处是XML Schema文档本身也是XML文档,而不是像DTD一样使用自成一体的语法。这就方便了用户和开发者,因为可以使用相同的工具来处理XML Schema和其他XML信息,而不必专门为Schema使用特殊工具。

Schema简单易懂,懂得XML语法、规则的人都可以立刻理解它。Schema的概念提出已久,但W3C的标准最近才出来,相应的应用支持尚未完善,但采用Schema已成为XML发展的一个趋势。  

在Schema中,也是通过对元素的定义和元素关系的定义来实现对整个文档性质和内容的定义。

在Schema中,元素是通过它的名字和内容模型来确定,名称就是该元素的名字,而内容模型实际上就是表示元素的类型。

Schema类型(type)可以分为两种形式:      

一种是非常简单的类型,被称为simple:          

简单类型不能包含元素和属性(注意在Schema中和DTD中一样,都有元素属性的说法,大都相同)      

一种是复杂的类型,被称为complex:        

复杂类型不仅可以包含属性,而且可以在其中嵌套其他的元素,或者可以和其他元素中的属性相关联。

相对于DTD,XML模式具有如下特点:

 ① XML模式用于为XML文档建立一个模式,规范文档中的标记和文本可能的组合形式。XML模式可以完成DTD所能实现的所有功能,并且其本身就是规范的XML文档。    

② 拥有丰富的数据类型。XML模式支持的数据类型有数字型、布尔型、整型、时间日期、URI、十进制数以及由简单类型构成的复杂数据类型。    

③ 允许用户自己定义所需要的数据类型。    

④ 支持属性分组。    

⑤ 支持名字空间。

XMLSchema支持两种不同的数据类型:复杂类型和简单类型。复杂类型描述了实例文档中的元素的子元素和属性。简单类型是一组由字符串表示的类型,这些类型没有元素和属性。简单类型使用simpleType结构来定义,复杂类型使用complexType结构来定义。

七、XML两种文档类型

“以数据为中心”(data-centric):“以数据为中心”的XML文档着重于文档中的数据,而非文档格式,如航班信息、销售定单、科学计算结果等。这种文档的数据一般由机器产生,来源于传统数据库中的数据。主要应用在电子商务、ERP、EAI等领域,集成不同数据源的数据,交换信息。     “以文档为中心”(document-centric):“以文档为中心”的XML文档主要是用来表示人类自然语言描述的数据,如电子邮件、书和用户手册。这种文档具有更复杂的结构,一般不是机器自动产生的。目前,Web上的大部分数据都可以表示成这种文档。

八、  XML编程接口

解析:其过程包括读入文档、分解文档,然后以各种方式处理这些分解后的部分,例如存放到数据库中。 通过解析器或称编程接口。    

由于XML均有起始标记及对应的结束标记,所以XML是结构化的,并且这些标记以有序的方式嵌套。同时,XML节点由标记及对应于标记的信息构成,不同的结点联系在一起,形如树状结构,当XML解析器分析XML时,在内存中会形成该文档的语法树表示,即为文档对象模型(Document Object Model,DOM)。

这里主要介绍两种主要的解析技术: DOM(Document Object ModeL)文档对象模型) SAX(Simple Api for XML),用于XML的简单API)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【架构专题】不会业务稳定性建设架构师直接开除!!!

为什么要做业务稳定性建设&#xff1f; 首先&#xff0c;什么是业务稳定性建设&#xff1f;顾名思义&#xff0c;就是保证系统的稳定运行&#xff0c;让用户不受任何影响地使用产品。对于一个企业来说&#xff0c;这非常重要&#xff0c;因为如果产品出现问题&#xff0c;那么…

Kafka(六)消费者

目录 Kafka消费者1 配置消费者bootstrap.serversgroup.idkey.deserializervalue.deserializergroup.instance.idfetch.min.bytes1fetch.max.wait.msfetch.max.bytes57671680 (55 mebibytes)max.poll.record500max.partition.fetch.bytessession.timeout.ms45000 (45 seconds)he…

C++实现单例模式

单例模式&#xff1a; 一种设计模式&#xff0c;它的目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。它适用于需要全局唯一的对象或资源的情况。 23种设计模式种最简单最常见的一种&#xff08;高频考点&#xff09; 要求&#xff1a;通过一个…

Python打印Python环境、PyTorch和CUDA版本、GPU数量名称等信息

代码&#xff1a; import torch import platformgpu_num torch.cuda.device_count() torch_version torch.__version__ python_version platform.python_version()print("Python Version: Python %s" % python_version) print("PyTorch Version: %s" %…

代码随想录刷题第四十二天| 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

代码随想录刷题第四十二天 今天是0-1背包问题&#xff0c;掌握了套路就不难了~~~ 0-1背包问题理论基础&#xff08;二维数组篇&#xff09;卡码网第46题 题目思路&#xff1a; 代码实现&#xff1a; input_line input() # 读取一行输入 mn input_line.split() m, n int…

Oracle-expdp备份变慢问题分析

问题背景&#xff1a; 应用有一个每日跑批之前的备份作业&#xff0c;通过expdp备份应用的用户数据&#xff0c;数据量大概为600G左右&#xff0c;正常情况下可以在20分钟内跑完&#xff0c;但最近expdp备份完成时间却突然猛涨到要2小时32分才能备份完&#xff0c;导致后续的跑…

QT上位机开发(会员充值软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所有的控件当中&#xff0c;除了label、edit、radio、combobox和button之外&#xff0c;另外一个用的比较多的控件就是grid&#xff0c;也可称之为…

前台收款单选择的保险公司 提示 往来户不属于该财务组织

前台收款单选择的保险公司 提示 往来户不属于该财务组织 问题避免 新增保险公司的时候&#xff0c;找一个已经存在的保险公司&#xff0c;利用多页签复制的方式来新增 保险公司 不然不能够自动生成 财务客户

【无标题】- 自用代码 优化资源时常用的备份一个目录

右键&#xff0c;备份并删除 using System.IO; using UnityEditor; using UnityEngine; /// <summary> /// 删除字体&#xff0c;减少资源等优化功能&#xff0c;并且可以备份 /// </summary> public class BackUpYouhuaWindow : EditorWindow {[MenuItem("As…

linux 02 vmware的快照,文件管理

01.快照 使用快照&#xff1a; 同时的快照管理器&#xff1a; 如果想要返回快照&#xff0c;选择要选择的快照&#xff0c;跳转 02. 文件管理&#xff1a; cd 02.touch 2. mkdir 文件夹 mkdir -p 文件夹 &#xff08;创建之前没有的上级文件夹&#xff09;

SD-WAN:提升连锁零售企业异地组网稳定性

连锁零售企业往往拥有众多分布在不同地区的分支机构和零售店&#xff0c;为保证企业高效运转&#xff0c;各地区之间的网络连接必须稳定可靠。但基于各地网络基础设施的不同和网络延迟、带宽等限制&#xff0c;异地组网往往并不稳定。在这背景下&#xff0c;SD-WAN成为连锁零售…

CentOS:docker容器日志清理

1.先查看磁盘空间 df -h 2.找到容器的containerId-json.log文件,并清理 find /var/lib/docker/containers/ -name *-json.log |xargs du -sh 3、可以根据需求清理对应日志也可以清理数据大的日志 $ cat /dev/null > /var/lib/docker/containers/dbaee0746cc6adad3768b4ef…

[C#]使用sdcb.paddleocr部署v4版本ocr识别模型

【官方框架地址】 https://github.com/sdcb/PaddleSharp 【算法介绍】 PaddleOCR&#xff0c;全称为PaddlePaddle OCR&#xff0c;是PaddlePaddle深度学习平台下的一款强大的光学字符识别工具。它利用深度学习技术&#xff0c;实现了高精度的文字识别&#xff0c;可以帮助用户…

K8S--安装MySQL8(单机)

原文网址&#xff1a;K8S--安装MySQL8&#xff08;单机&#xff09;-CSDN博客 简介 本文介绍K8S部署MySQL8&#xff08;单机&#xff09;的方法。 本文的目标 1.通过PV和PVC&#xff08;hostPath方式&#xff09;存储MySQL的数据 2.通过Deployment、Service部署MySQL8&…

SpringBoot2基础

SpringBoot2 一、初始化项目 ①、创建project ②、构建maven项目 如果选项里没有8的&#xff0c;可以最顶上镜像换成阿里巴巴的&#xff1a;https://start.aliyun.com/ 直接在main函数运行就行 二、SpringBoot入门 1、复制工程 原则 保留工程基础结构抹掉原始工程痕迹 做个…

【MIdjourney】图像角度关键词

本篇仅是我个人在使用过程中的一些经验之谈&#xff0c;不代表一定是对的&#xff0c;如有任何问题欢迎在评论区指正&#xff0c;如有补充也欢迎在评论区留言。 1.侧面视角(from side) 侧面视角观察或拍摄的主体通常以其侧面的特征为主要焦点&#xff0c;以便更好地展示其轮廓…

K近邻算法(K-Nearest Neighbors,KNN)

K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;KNN&#xff09;是一种基本的监督学习算法&#xff0c;常用于分类和回归任务。KNN的基本思想是通过测量不同样本点之间的距离&#xff0c;将新样本的类别标签赋予其K个最近邻居中出现最频繁的类别。 以下是KNN的基本原理和…

CAN协议层详细介绍

CAN物理层协议介绍-CSDN博客 目录 1. CAN的波特率及位同步 2. 位时序分解 3. CAN的报文种类及结构 3.1 报文的种类 3.2 数据帧的结构 3.2.1 仲裁段 3.2.2 RTR位(Remote Transmission Request Bit) 3.2.3 IDE位(Identifier Extension Bit) 3.2.3 SRR位(Substi…

【代码】Keras3.0:实现残差连接

简介 残差连接是一种非常重要的网络结构创新&#xff0c;最早被广泛应用于ResNet&#xff08;Residual Neural Network&#xff09;模型中&#xff0c;由何凯明等人在2015年的论文"Deep Residual Learning for Image Recognition"中提出。 核心思想 通过引入“short…

RK3399平台入门到精通系列讲解(实验篇)共享工作队列的使用

🚀返回总目录 文章目录 一、工作队列相关接口函数1.1、初始化函数1.2、调度/取消调度工作队列函数二、信号驱动 IO 实验源码2.1、Makefile2.2、驱动部分代码工作队列是实现中断下半部分的机制之一,是一种用于管理任务的数据结构或机制。它通常用于多线程,多进程或分布式系统…