【译】DTD - Entities
实体用于定义XML文档中特殊字符的快捷方式。 实体主要有四种类型:
- 内置实体(Built-in entities)
- 字符实体(Character entities)
- 通用实体(General entities)
- 参数实体(Parameter entities)
实体声明语法
一般而言,实体可以被声明为内部的和外部的。让我们先来了解一下概念和语法:
内部实体
如果一个实体是在一个DTD中声明的,那么就称其为内部实体。
语法
内部实体的声明如下:
<!ENTITY entity_name "entity_value">
如上的语法中:
- entity_name:就是实体的名字,后面双引号或单引号中的就是它的值。
- entity_value:保存实体名称的值。
- 内部实体的实体值用'&'符号来引用,也就是这样: &entity_name。
例子
下面是内部实体声明的简单例子:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE address [ <!ELEMENT address (#PCDATA)> <!ENTITY name "Tanmay patil"> <!ENTITY company "TutorialsPoint"> <!ENTITY phone_no "(011) 123-4567"> ]> <address> &name; &company; &phone_no; </address>
在上面的例子中,实体名称name、company、phone_no都会被XML文档中相应的值所替换。实体值的引用是在实体名字前加'&'。
将上面的内容保存为sample.xml,用浏览器打开,你就可以看到name、company、phone_no的值都会相应的被替换掉。

外部实体
如果一个实体是声明在DTD的外面就称之为外部实体。你可以使用系统标识符或公共标识符来引用外部实体。
语法
外部实体的声明语法如下:
<!ENTITY name SYSTEM "URI/URL">
如上的语法中:
- name:实体名。
- SYSTEM:声明为外部实体关键字。
- URI/URL:双引号或单引号括起来的就是外部资源的地址。
类型
可以通过如下的方法来引用一个外部实体:
- 系统标识符:系统标识符可以指定包含DTD声明的外部文件的位置。使用语法如下:
<!DOCTYPE name SYSTEM "address.dtd" [...]>
正如你所见,包含了SYSTEM关键字和指向文件位置的URI引用。
- 公共标识符:提供了一个定位DTD资源的机制,写法如下:
<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">
正如你所见,以关键字PUBLIC开头,接着是一个特殊的标识符。公共标识符用于标识目录中的项。公共标识符可以遵循任何格式; 然而,常用的格式称为正式公共标识符或FPI。
例子
我们先通过下面这个例子来理解一下外部实体:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE address SYSTEM "address.dtd"> <address> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </address>
下面就是DTD文件address.dtd的内容:
<!ELEMENT address (name, company, phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)>

内置实体
所有的XML解析器都必须支持内置实体。一般来讲,你可以在任何地方引用这些实体(内置实体)。你也可以在XML文档中使用普通文本,例如元素内容和属性值。
在格式良好的XML文件中共有五种内置实体扮演着它们的角色,它们分别是:
实体引用 字符 < < > > & & " " ' '
例子
下面的例子展示了内置实体声明:
<?xml version="1.0"?> <note> <description>I'm a technical writer & programmer</description> </note>

正如你所见,每当处理器遇到& 字符,就将其替换为&。
字符实体
字符实体用于命名一些信息符号表示的实体, 也即是一些难以或不可输入的字符可以用字符实体来代替。
例子
下面的例子展示了字符实体的声明:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE author[ <!ELEMENT author (#PCDATA)> <!ENTITY writer "Tanmay patil"> <!ENTITY copyright "©"> ]> <author>&writer;©right;</author>
注意到这里我们用©来代替版权字符。将文件内容保存为sample4.xml,然后用浏览器打开, 你就会看到版权字符被©所替换。[代码里的被自动替换了]
通用实体
通用实体必须要在DTD中先声明之后才能在XML文档中使用。除了可以代表单个字符外,通用实体可以代表多个字符、段落、甚至是文档。
语法
声明一个通用实体,在你的DTD中使用这种通用的形式进行声明:
<!ENTITY ename "text">
例子
下面例子演示了通用实体声明:
<?xml version="1.0"?> <!DOCTYPE note [ <!ENTITY source-text "tutorialspoint"> ]> <note> &source-text; </note>
每当XML解析器遇到对source-text实体的引用时,便会在引用的地方向应用程序提供替换文本。
参数实体
参数实体的目的是使你能够创建可重用的替换文本部分。
语法
下面是参数实体的声明语法:
<!ENTITY % ename "entity_value">
entity_value是除'&'、'%'、' " '之外的任何值。
例子
下面的例子演示了参数实体的声明。设想一下,你的元素声明如下:
<!ELEMENT residence (name, street, pincode, city, phone)> <!ELEMENT apartment (name, street, pincode, city, phone)> <!ELEMENT office (name, street, pincode, city, phone)> <!ELEMENT shop (name, street, pincode, city, phone)>
现在你想额外增加一个元素contact, 之后你就必须分别在四个声明中加上这个元素。因此,我们可以使用参数实体引用。上面的例子中,使用参数实体引用会像下面这样:
<!ENTITY % area "name, street, pincode, city"> <!ENTITY % contact "phone">
参数实体的引用方法跟通用实体一样, 使用'%'符号而不是'&'符号进行引用。
<!ELEMENT residence (%area;, %contact;)> <!ELEMENT apartment (%area;, %contact;)> <!ELEMENT office (%area;, %contact;)> <!ELEMENT shop (%area;, %contact;)>
当解析器读取这些声明时,它将实体的替换文本替换为实体引用。
【注】英文原文中有些许笔误,country->contact, 不过不影响文章阅读,如果发现翻译的文章有错误的地方,欢迎指出,谢谢!
【译】DTD - Entities的更多相关文章
- How to read the HTML DTD
Contents How to read the HTML DTD 1. DTD Comments 2. Parameter Entity definitions 3. Element declara ...
- XML DTD验证
XML DTD验证 一.什么是DTD 文档类型定义(DTD:Document Type Definition)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. DTD 可被成行 ...
- DTD学习笔记
1. DTD基本介绍 xml文件分为两种类型,一个是在好形式,这是well-formed,还有一个合法有效,这是valid. XML文件遵循-called"好形式"各种语法规则要 ...
- xml基础之二(XML结构【2】)DTD文档模版
xml基础之二(XML结构[2])DTD文档模版 xml 模板 文档结构 我们知道XML主要用于数据的存储和传输,所以无论是自定义还是外部引用DTD模板文档,都是为了突出数据的存储规范.DTD(文档 ...
- xxe漏洞的学习与利用总结
前言 对于xxe漏洞的认识一直都不是很清楚,而在我为期不长的挖洞生涯中也没有遇到过,所以就想着总结一下,撰写此文以作为记录,加深自己对xxe漏洞的认识. xml基础知识 要了解xxe漏洞,那么一定得先 ...
- XXE(XML External Entity attack)XML外部实体注入攻击
导语 XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击.由于程序在解析输入的XML数据时,解析了攻击者 ...
- 浅谈XXE漏洞攻击与防御——本质上就是注入,盗取数据用
浅谈XXE漏洞攻击与防御 from:https://thief.one/2017/06/20/1/ XML基础 在介绍xxe漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点 ...
- ref:浅谈XXE漏洞攻击与防御
ref:https://thief.one/2017/06/20/1/ 浅谈XXE漏洞攻击与防御 发表于 2017-06-20 | 分类于 web安全 | 热度 3189 ℃ 你会挽着我 ...
- WEB安全番外第三篇--关于XXE
一.什么是XXE 1.XML实体简介 (1)在一段时间中,XML都是WEB信息传输的主要方法,时至今日XML在WEB中作为前后台之间传递数据的结构,依然发挥着重要的作用.在XML中有一种结构叫做实体: ...
随机推荐
- web移动端
h5:低版本(IE8及以下不支持H5标签,要引入html5shiv.js才能正常运行) 条件引入,只是针对PC端,移动端不存在这样的操作 <figure>:专门用来存放图片和相关介绍的 & ...
- EasyUI中DataGrid构建复合表头
在使用easyui的DataGrid控件时,构建复合表头就显得非常简单了.只需要在使用columns属性时通过数组的方式编写列名即可.如我们需要构建成一个如下的表头: Columns的代码如下: co ...
- Android四大组件之Activity & Fragement(续)
1.Activity和Fragment的异同. Activity是UI界面交互的主体,而fragment是这个主体上的元素. 一个activity可以包含0到n个fragment. fragment可 ...
- 【数据库_Postgresql】sql查询结果添加序号列
ROW_NUMBER () OVER (ORDER BY A .ordernumber ASC) AS 序号
- 【Loj#535】花火(线段树,扫描线)
[Loj#535]花火(线段树,扫描线) 题面 Loj 题解 首先如果不考虑交换任意两个数这个操作,答案就是逆序对的个数. 那么暴力就是枚举交换哪个两个数,然后用数据结构之类的东西动态维护逆序对. 但 ...
- BZOJ1176:[Balkan2007]Mokia——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1176 Description(题面本人自行修改了一下) 维护一个W*W的矩阵,初始值均为0.每次操作 ...
- Linux内核设计与实现第五周读书笔记
第十八章 调试 18.1准备开始 需要的只是: 一个确定的bug.大部分bug通常都不是行为可靠而且定义明确的. 一个藏匿bug的内核版本. 相关的内核代码的知识和运气. 18.2内核中的bug 内核 ...
- 【Python3的进制扫盲】
一.进制 1.进制简介 进制就是进位制,是人们规定的一种进位方法.计算机底层的数据运算和存储都是二进制数据.计算机语言就是二进制,计算机能直接识别二进制数据,其它数据都不能直接识别. 2.常用进制 对 ...
- SNMP-网络管理协议
SNMP协议简介: a. 轮询(Polling) -- 定时获取状态, 中断(Interrupt)--出问题通知 b. 共同体名(community) -- 口令--只读口令 --读写口令 使用SNM ...
- 据说要写一个CTSC&APIO的收获
就不写流水帐了,总的写一下吧.先从最浅显的地方开始——知识.大概被普及了一发带花树,算上自己的考试,还被普及了一发洲阁筛.当然更多的还是对于一些知识的强化,比如:乱搞(这东西真是太重点了啊).DP.数 ...