【XML】学习笔记第二章-dtd
XML-DTD
DTD(Document Type Definition):文档类型定义。
DTD实际应用:
- 验证XML文档数据的有效性
- 为某类XML文档提供统一的格式和相同的结构
- 保证在一定范围内,XML文档数据的交流和共享
- 开发人员可根据DTD了解到XML文档的逻辑结构,从而写出相应的处理应用程序
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE 根元素名称[
<!ELEMENT 跟元素名称 (第一个子元素,第二个子元素)>
<!ELEMENT 第一个子元素 (#PCDATA)>
<!ELEMENT 第二个子元素 (#PCDATA)>
<!ATTLIST 第一个子元素 属性一 CDATA #REQUIRED>
]>
<根元素名称>
<第一个子元素 属性一="任意内容">
文本内容1
</第一个子元素>
<第二个子元素>
文本内容2
</第二个子元素>
</根元素名称>
符合XML语法的XML文档是结构良好的XML文档
通过DTD验证的XML文档是有效的XML文档
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE user[
<!ELEMENT user (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST name type CDATA #REQUIRED>
]>
<user>
<name type="zh-cn">
李白
</name>
<age>
18
</age>
</user>
DTD语句
基本声明语句
- 元素类型声明语句
<!ELEMENT> - 属性列表声明语句
<!ATTLIST> - 实体声明语句
<!ENTITY> - 符号声明语句
<!NOTATION> - 注释语句
<!-- -->
定义关键字一定要大写,例如
DOCTYPE、ELEMENT、#PCDATA元素名称与数据类型之间要有空格(元素名称后如果有内容,要用空格隔开)
引用外部DTD
<!DOCTYPE 根元素名称 SYSTEM "外部DTD的URL">
外部DTD优点:可以方便高效的被多个XML文档所共享(就是多个XML用同一个DTD)
外部DTD的创建方式、语法、内部DTD是一样的。
<!ELEMENT user (profile,name,age)>
<!ELEMENT profile (#PCDATA)>
<!ATTLIST profile type NOTATION (jpg|png) #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name type CDATA #REQUIRED>
<!ELEMENT age (#PCDATA)>
<!ENTITY Profile "USER PROFILE">
<!NOTATION jpg SYSTEM "Image/jpeg" >
<!NOTATION png SYSTEM "Image/png" >
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE user SYSTEM "dtd-learning03.dtd">
<user>
<profile type="jpg">
&Profile;
</profile>
<name type="zh-cn">
李白
</name>
<age>
18
</age>
</user>
SYSTEM 表示私有的;公共有的PUBLIC。
另一种说法是:SYSTEM,表示当前的DTD文件是本地的
如果写的是PUBLIC,则表示引入的DTD文件是来自于网络的.
公共DTD名称约定:如果是ISO标准DTD,命名以“+”开始,否则以“-”开始。
<!DOCTYPE root_element PUBLIC "DTD_name" "DTD_location">
根据 DTD_name选择选择版本,如果根据DTD_name找不到相应版本,则根据DTD_location来找。
DTD元素
四种元素类型
- 空元素。例如
<tag/> - 仅包含文本的元素(即字符内容)例如:
<tag>微信公众号:萌狼蓝天</tag> - 仅包含子元素的元素
<tag><chid>mllt9920</chid></tag> - 混合型(包含内容既有内容也有文本内容)
元素定义关键字
EMPTY该元素不能包含元素和文本,但是可以有属性ANY该元素可以包含任何在DTD中定义的元素内容,而且元素出现的次数和顺序不受限制#PCDATA仅能包含任何字符数据的文本内容。(子元素)仅能包含子元素
在元素设置中,如果元素包含多个子元素,这些子元素是有顺序的,没有特殊约束情况下,每个子元素必须出现且只能出现一次。
修饰符号
| 符号 | 用途 |
|---|---|
| () | 用来给元素分组 |
| \ | |
| + | 元素至少出现一次,一次或多次 |
| * | 元素可有可无,出现零次、一次或多次 |
| ? | 元素可有可无,但最多只能出现一次 |
| 符号 | 用途 | 示例 | 示例说明 |
|---|---|---|---|
| ( ) | 用来给元素分组 | (古龙\ | 金庸\ |
| \ | 在列出的对象中选择一个 | (男人\ | |
| + | 该对象最少出现一次,可以出现多次 (1或多次) | (成员+) | 表示成员必须出现,而且可以出现多个成员 |
| * | 该对象允许出现零次到任意多次(0到多次) | (爱好*) | 爱好可以出现零次到多次 |
| ? | 该对象可以出现,但只能出现一次 (0到1次) | (菜鸟?) | 菜鸟可以出现,也可以不出现,如果出现的话,最多只能出现一次 |
| , | 对象必须按指定的顺序出现 | (西瓜,苹果,香蕉) | 表示西瓜、苹果、香蕉必须出现,并且按这个顺序出现 |
无修饰符号:必须出现且只能出现一次
DTD中的属性
在DTD中声明元素属性的语法:¡<!ATTLIST 元素名称 [属性名 属性类型 [约束] [缺省值]]+>
在一个ATTLIST 中可以定义同一个元素下的一个或多个属性。如果包含多个属性声明,属性声明之间使用空格间隔。
元素名称:属性所属的元素名称
属性名:属性名称
属性类型:属性的值类型
约束:元素对属性的约束
属性修饰
| 修饰符 | 含义 |
|---|---|
| #REQUIRED | 表示该属性是必需的,不能没有。 |
| #IMPLIED | 表示该属性可以有也可以没有。 |
| #FIXED | 表示在XML文档中只会给出一个元素属性所定义的固定值。只有当约束为该值时,才能给出缺省值,注意缺省值必须给出。 |
属性类型
| 属性类型 | 说明 |
|---|---|
| CDATA | 单纯的字符数据,大部分属性都设置为该类型 |
| ID | 具有唯一性的属性值,需要注意的是该属性值必须以字母开头 |
| IDREF | 引用其它ID属性的值,该值必须在其它ID属性中存在 |
| IDREFS | 引用多个其它ID属性的值,中间使用空格间隔 |
| ENTITY | 未解析的外部实体类型, |
| ENTITIES | 多个未解析的外部实体类型,中间使用空格间隔 |
| NMTOKEN | 是Name Token,就是关键字的名字。可以包含字母、数字、[.]、[-]、[_]、[:]组合的名字 |
| NMTOKENS | 多个NMTOKEN,中间使用空格间隔 |
| NOTATION | 标记名称 |
| Enumerated | 枚举类型的属性,只能从已有的属性中选取,不能填入新项目 |
例如
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "dtd-learning04.dtd">
<books>
<book type="科技">
<title>XML教程</title>
<author lastname="罗" firstname="福强" />
<author lastname="杨" firstname="剑"/>
<press>清华大学出版社</press>
<ISBN>978-7-302-22348-1</ISBN>
</book>
<book type="文学">
<title>三国演义</title>
<author lastname="罗" firstname="贯中"/>
<press>人民文学出版社</press>
<ISBN>978702005155</ISBN>
</book>
</books>
<!ELEMENT books (book)*>
<!ELEMENT book (title,author+,press,ISBN)>
<!ATTLIST book type CDATA #REQUIRED>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author EMPTY>
<!ATTLIST author lastname CDATA #REQUIRED>
<!ATTLIST author firstname CDATA #REQUIRED>
<!ELEMENT press (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
DTD中的实体和符号

内部实体的语法格式: <!ENTITY 实体名称 “实体内容”>
- 实体名称:实体名称由DTD程序员自己定义,但必须满足唯一性,即不能重名。同时满足XML的命名规范。
- 实体内容:所需要表达的文本内容
定义外部解析实体的语法:<!ENTITY 实体名称 SYSTEM|PUBLIC [“公共实体标识符” ] “URI/URL”>
URI/URL:所引用的外部文件的路径地址,被引用的外部文件必须是可以被解析的,扩展名没有限制。
实体为PUBLIC时才会有相应的“公共实体标识符” ,如果为SYSTEM则没有“公共实体标识符”
定义外部未解析实体的语法:<!ENTITY 实体名称 SYSTEM “URL/URL” NDATA 标记名>
- URI/URL:所引用的外部文件的路径地址
- 标记名:被定义的符号的名称。
这是通过引用外部文件来解析实体。例如图片无法被解析,就用外部图片查看类工具解析
声明参数内部解析实体的语法:<!ENTITY % 参数实体名称 “实体内容”>
- 参数实体名称:实体名称由DTD程序员自己定义,但必须满足唯一性,即不能重名。同时满足XML的命名规范。
- 实体内容:所需要表达的文本内容。
声明参数外部解析实体的语法:<!ENTITY % 参数实体名称 SYSTEM “URL/URL">
URI/URL:所引用的外部文件的路径地址
- 引用参数实体的语法:
- %参数实体名称;
参数实体都是在dtd中被引用的
符号
普通符号的语法格式:<!NOTATION 符号名称 SYSTEM | PUBLIC [“公共符号标识符”] “URI\URL”>
- 符号名称:名称由DTD程序员自己定义,但必须满足唯一性,即不能重名。同时满足XML的命名规范
- URI\URL:外部来处理这些未解析数据的程序路径
- 符号为PUBLIC时才会有相应的“公共符号标识符” ,如果为SYSTEM则没有“公共符号标识符”
坑
一个小坑
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE user [
<!ELEMENT user (profile|name|age)*>
<!ELEMENT profile (#PCDATA)>
<!ATTLIST profile
type NOTATION (jpg|png) #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
type CDATA #REQUIRED>
<!ELEMENT age (#PCDATA)>
<!NOTATION jpg SYSTEM "Image/jpeg" >
<!NOTATION png SYSTEM "Image/png" >
<!ENTITY PIC "888">
]>
<user>
<profile type="jpg">&PIC;</profile>
<name type="zh-cn">李白</name>
<age>18</age>
</user>
如上,正常执行,但是如果是引用的外部dtd,如下
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE user SYSTEM "dtd-learning03.dtd">
<user>
<profile type="jpg">&PIC;</profile>
<name type="zh-cn">李白</name>
<age>18</age>
</user>
<!ELEMENT user (profile,name,age)>
<!ELEMENT profile (#PCDATA)>
<!ATTLIST profile type NOTATION (jpg|png) #REQUIRED><!--定义属性。这是profile的属性,属性名称为type,值为jpg或者png,必须填写属性-->
<!ELEMENT name (#PCDATA)>
<!ATTLIST name type CDATA #REQUIRED>
<!ELEMENT age (#PCDATA)>
<!NOTATION jpg SYSTEM "Image/jpeg" >
<!NOTATION png SYSTEM "Image/png" >
<!ENTITY PIC "USER PROFILE" >
则会出现找不到&PIC;的情况,询问老师后知道:浏览器不支持这样……
【XML】学习笔记第二章-dtd的更多相关文章
- Spring学习笔记 - 第二章 - 注解开发、配置管理第三方Bean、注解管理第三方Bean、Spring 整合 MyBatis 和 Junit 案例
Spring 学习笔记全系列传送门: Spring学习笔记 - 第一章 - IoC(控制反转).IoC容器.Bean的实例化与生命周期.DI(依赖注入) [本章]Spring学习笔记 - 第二章 - ...
- SpringMVC学习笔记 - 第二章 - SSM整合案例 - 技术整合、统一结果封装、统一异常处理、前后联调、拦截器
[前置内容]Spring 学习笔记全系列传送门: Spring学习笔记 - 第一章 - IoC(控制反转).IoC容器.Bean的实例化与生命周期.DI(依赖注入) Spring学习笔记 - 第二章 ...
- 《DOM Scripting》学习笔记-——第二章 js语法
<Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...
- The Road to learn React书籍学习笔记(第二章)
The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...
- [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”
[HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...
- [HeadFirst-JSPServlet学习笔记][第二章:高层概述]
第二章:高层体系结构 容器 1 什么是容器? servelet没有main()方法.它们受控于另一个Java应用,这个Java应用称为容器(Container) Tomcat就是这样一个容器.Web服 ...
- c#高级编程第七版 学习笔记 第二章 核心c#
第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...
- 《Python基础教程(第二版)》学习笔记 -> 第二章 列表和元组
本章将引入一个新的概念:数据结构. 数据结构是通过某种方式阻止在一起的数据元素的集合,这些数据元素可以是数字或者字符,设置可以是其他数据结构. Python中,最基本的数据结构是序列(Sequence ...
- Java 学习笔记 ------第二章 从JDK到IDE
本章学习目标: 了解与设定PATH 了解与指定CLASSPATH 了解与指定SOURCEPATH 使用package与import管理类别 初步认识JDK与IDE的对应关系 一.第一个Java程序 工 ...
- JavaScript高级程序设计学习笔记第二章
1.向 HTML 页面中插入 JavaScript 的主要方法,就是使用<script>元素 2.HTML 4.01中定义了<script>元素的六个属性(方便记忆,可将6个属 ...
随机推荐
- SpringCloud入门(四)Ribbon负载均衡
一.Ribbon负载均衡原理SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的. SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTempl ...
- .Net 反射的学习
// 反射 // 一切从 type 开始 2 种拿到 type 的方式 // 作用:动态的操作对象 获取属性 方法 特性 // 1. 拿到对象的 type // typeof(类); // 2. 拿到 ...
- KubeKey 2.0.0 发布:让离线部署 K8s 更加便捷
2022 年 3 月 8 日,KubeKey 2.0.0 正式发布,这是 KubeKey 的第 7 个正式版本,也是非常重要的一个版本.该版本新增了清单(manifest)和制品(artifact)的 ...
- 修复 KubeSphere 内置 Jenkins 的 Apache Log4j2 漏洞
作者:老Z,中电信数智科技有限公司山东分公司运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及 Kubernetes.KubeSphere.DevOps.OpenStack.Ansi ...
- 来看看一台Linux可支持多少个链接 | 漫画
困惑很多人的并发问题 在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白.那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题. 很多同学看到这个 ...
- Windows电脑无法给airpods充电的解决办法
耳机盒与电脑都有TYPEC接口,由于驱动问题,接在一起是充不了电的,需要更改设置解决: 打开设置 -> 蓝牙与其他设备 -> 显示更多设备 往下翻,找到"更多设备与打印机设置&q ...
- GaussDB: db2->gaussdb 函数转换
一.db2->gaussdb函数转换 问题描述:使用GaussDB替代DB2的方案,使用起来还是有些差别,做一下函数的映射转换. DB2写法 GaussDB改写语法 日期函数 days(OU ...
- HNCTF [Week1]Interesting_http
<center>HNCTF [Week1]Interesting_http </center> 五毛钱翻译:请用post给我一个 want Burp Suite 抓包传参 &l ...
- DearPyGui环境配置
DearPyGui 是一个基于Python的图形用户界面(GUI)工具包,它以简单易用而著称.这个库利用GPU加速渲染和高效的C/C++底层代码,确保了出色的性能和稳定性.DearPyGui支持异步函 ...
- 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现三
一.前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势.传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速.便捷需求.这些问题不 ...