原文: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. 3dContactPointAnnotationTool开发日志(二九)

      今天想着在Windows平台上跑通那个代码,不过它的官网上写的支持平台不包括windows,但我还是想试试,因为看他的依赖好像和平台的关系不是特别大.   看了下它的py代码,不知道是py2还是p ...

  2. maven 添加tomcat依赖

    https://my.oschina.net/angel243/blog/178554

  3. 更改HTTP头信息

    http信息分三部分 1.请求行 GET  lizi.php  HTTP/1.1 2.HTTP头信 Host: localhost Connection: keep-alive Cache-Contr ...

  4. linux下sublime text 3安装到配置

    1. Sublime Text 3的下载安装 到官方网站上http://www.sublimetext.com/3下载64位(系统位64位)的.deb安装包(http://c758482.r82.cf ...

  5. appium1.6.3/1.6.4/1.6.5版本下如何支持安卓下ByName定位

    1. 换其他定位方式,比如用xpath代替 2. 使用ByAccessibilityId代替,感觉没什么效果 一招修改源码解决问题根源,修改方法如下: 找到你的appium\node_modules\ ...

  6. 网页移动到一个高度后加载网页元素【getBoundingClientRect好用】

    $(window).scroll(function () { var windowH = $(window).height();//取可视窗口的高度 ).getBoundingClientRect() ...

  7. jquery截取手机号中间4位数,然后变为*

    $(function() { var phone = $('#phone').text(); var mphone = phone.substr(0, 3) + '****' + phone.subs ...

  8. 【Java】关于@RequestBody

    首先@RequestBody需要接的参数是一个string化的json,这里直接使用JSON.stringify(json)这个方法来转化 其次@RequestBody,从名称上来看也就是说要读取的数 ...

  9. 【开发工具IDE】eclipse的web项目的tomcat安装部署问题

    一.发现问题 在eclipse中新建Dynamic Web Project,配置好本地的tomcat并写好代码后选择Run on Server,但运行后发现在tomcat的安装目录下的webapps并 ...

  10. 【二】shiro入门 之 身份验证

    大体步骤如下: 1.首先通过new IniSecurityManagerFactory 并指定一个ini 配置文件来创建一个SecurityManager工厂: 2.接着获取SecurityManag ...