原文: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. MySQL---索引算法B+/B-树原理(一)

    B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树: ⑵若根结点不是叶子 ...

  2. mysql 、慢查询、到底如何玩

    在项目开发中,那些开发大佬经常会写出一些SQL语句,一条糟糕的SQL语句可能让你测试的整个程序都非常慢,超过10秒的话,我觉得一般用户就会选择关闭网页,如何优化SQL语句将那些运行时间 比较长的SQL ...

  3. C# 为VB6.0程序模拟串口数据

    为VB6.0编写程序模拟数据测试使用. 一.VB6.0 控件MSComm,来发送接收串口数据 CommPort 属性设置并返回通讯端口号,虚拟端口为COM2. Settings 属性设置并返回端口的波 ...

  4. 第81天:jQuery 插件使用方法

    在追求页面互动效果的时代,大家都想把页面效果做的美轮美奂,这一切都离不开前端技术脚本Javascript,而最近常被人用到的Javascript库文件则是jQuery.  jQuery的使用具体步骤如 ...

  5. URL补充

    1. 笔记 2. 关于默认值的解释:在url里面,可以直接给views.index传递一个默认值. index函数接收一个形式参数. 在urls.py中,可以直接传递一个实参(也就是默认值). 打印结 ...

  6. bzoj2969 矩形粉刷 概率期望

    此题在bzoj是权限题,,,所以放另一个oj的链接 题解: 因为期望线性可加,所以可以对每个方格单独考虑贡献.每个方格的贡献就为至少被粉刷过一次的概率×1(每个格子的最大贡献就是1...)每个方格至少 ...

  7. 【移动支付】.NET支付宝App支付接入

    一.前言        最近也是为了新产品忙得起飞,博客都更新的慢了.新产品为了方便用户支付,需要支付宝扫码接入.这活落到了我的身上.产品是Windows系统下的桌面软件,通过软件生成二维码支付.界面 ...

  8. Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程

    Linux内核分析第三周学习博客--跟踪分析Linux内核的启动过程 实验过程截图: 过程分析: 在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_t ...

  9. mysql主从配置的过程

    首先参考MySQL5.5官方手册 以下章节: 6.4节如何设置复制 13.6.1节 用于控制主服务器的SQL语句 13.6.2节 用于控制从服务器的SQL语句 6.8节 复制启动选项 6.5节 不同M ...

  10. hive1.1.0建立外部表关联HDFS文件

    0. 说明 已经安装好Hadoop和hive环境,hive把元数据存储在mysql数据库.这里仅讨论外部表和HDFS的关联,并且删掉外部表之后,对HDFS上的文件没有影响. 1. 在HDFS创建分区, ...