原文: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文件中共有五种内置实体扮演着它们的角色,它们分别是:

实体引用	     字符
&lt;		<
&gt;		>
&amp;		&
&quot;		"
&apos;		'

例子

  下面的例子展示了内置实体声明:

<?xml version="1.0"?>
<note>
	<description>I'm a technical writer &amp; programmer</description>
</note>

  正如你所见,每当处理器遇到&amp; 字符,就将其替换为&。

字符实体

  字符实体用于命名一些信息符号表示的实体, 也即是一些难以或不可输入的字符可以用字符实体来代替。

例子

  下面的例子展示了字符实体的声明:

<?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的更多相关文章

  1. How to read the HTML DTD

    Contents How to read the HTML DTD 1. DTD Comments 2. Parameter Entity definitions 3. Element declara ...

  2. XML DTD验证

    XML DTD验证 一.什么是DTD 文档类型定义(DTD:Document Type Definition)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. DTD 可被成行 ...

  3. DTD学习笔记

    1.  DTD基本介绍 xml文件分为两种类型,一个是在好形式,这是well-formed,还有一个合法有效,这是valid. XML文件遵循-called"好形式"各种语法规则要 ...

  4. xml基础之二(XML结构【2】)DTD文档模版

    xml基础之二(XML结构[2])DTD文档模版 xml 模板 文档结构  我们知道XML主要用于数据的存储和传输,所以无论是自定义还是外部引用DTD模板文档,都是为了突出数据的存储规范.DTD(文档 ...

  5. xxe漏洞的学习与利用总结

    前言 对于xxe漏洞的认识一直都不是很清楚,而在我为期不长的挖洞生涯中也没有遇到过,所以就想着总结一下,撰写此文以作为记录,加深自己对xxe漏洞的认识. xml基础知识 要了解xxe漏洞,那么一定得先 ...

  6. XXE(XML External Entity attack)XML外部实体注入攻击

    导语 XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击.由于程序在解析输入的XML数据时,解析了攻击者 ...

  7. 浅谈XXE漏洞攻击与防御——本质上就是注入,盗取数据用

    浅谈XXE漏洞攻击与防御 from:https://thief.one/2017/06/20/1/ XML基础 在介绍xxe漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点 ...

  8. ref:浅谈XXE漏洞攻击与防御

    ref:https://thief.one/2017/06/20/1/ 浅谈XXE漏洞攻击与防御 发表于 2017-06-20   |   分类于 web安全  |   热度 3189 ℃ 你会挽着我 ...

  9. WEB安全番外第三篇--关于XXE

    一.什么是XXE 1.XML实体简介 (1)在一段时间中,XML都是WEB信息传输的主要方法,时至今日XML在WEB中作为前后台之间传递数据的结构,依然发挥着重要的作用.在XML中有一种结构叫做实体: ...

随机推荐

  1. 对IT行业的一些思考

          阅读完两篇报道,从“2014年十大最热门行业和职业排行榜”可以看出最热门的行业是IT行业,可以看出IT行业在未来的发展前景很乐观,选择IT行业的人也会越来越多,IT行业也会越来越庞大.但是 ...

  2. Java包名命名规则(转载)

    转载自:http://lilinhai548.blog.163.com/blog/static/5847332920155132151359/ 鸣谢原作者  学习Java的童鞋们都知道,Java的包. ...

  3. node.js入门(二) 模块 事件驱动

    模块化结构 node.js 使用了 CommonJS 定义的模块系统.不同的功能组件被划分成不同的模块.应用可以根据自己的需要来选择使用合适的模块.每个模块都会暴露一些公共的方法或属性.模块使用者直接 ...

  4. List、Set、Map典型实现

    1:集合 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程 ...

  5. 数据库引擎InnoDB和MyISAM区别

    MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...

  6. HDU4803_Poor Warehouse Keeper

    题目很有意思,我想说其实我在比赛的时候就看过了一下这个题目,今天才这么快搞出来吧. 其实总共按上键的次数不会超过10个,我们可以每次假设相隔按两次上键之间按了xi次下键,由于上键的次数是确定的,所以最 ...

  7. action动作类的生命周期

    创建:Action动作类每次请求的时候都会创建一个实例对象 销毁:当前action动作类的请求响应完后就消失了 跟javaweb中的HttpServletRequest的生命周期是一样的,struts ...

  8. [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...

  9. Intel WIDI (Wireless Display) 相关技术知识分析

    一. WIFI 1.如何查找WIFI设备 非p2p设备 Beacons 包(同步,SSID) 速率 1M/s 2.4G HZ 13个信道,1,6,11三个信道不重叠 2.P2P 认证 客户端在每个通道 ...

  10. 【BZOJ1497】【NOI2006】最大获利(网络流)

    [BZOJ1497][NOI2006]最大获利(网络流) 题面 BZOJ Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS& ...