实体可以简单的理解为引用数据项的方法,可以是普通的文本也可以是二进制数据。

实体可以分为通用实体和参数实体。通用实体用于XML当中,用于引用文本或者二进制数据,而参数实体只能在DTD中使用。通用实体与参数实体可以是内部实 体或者是外部实体。实体还可以分为未解析与解析的实体,不同在于解析实体是规范的XML文本,而未解析的实体是不应该被解析器解析的二进制数据。

3种实体可以组合出8种实体,但实际上XML只用到5种形态:
1、通用内部解析实体
2、通用外部解析实体
3、通用外部未解析实体
4、参数内部解析实体
5、参数外部解析实体

通用内部解析实体

语法:

<!ENTITY 名称 “内容”>

实例:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ELEMENT root (shop)+>
<!ELEMENT shop (name, address, size, pic*, remark?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ELEMENT size (#PCDATA)>
<!ELEMENT pic (#PCDATA)>
<!ELEMENT remark (#PCDATA)>
<!ENTITY big "旗舰店">
<!ENTITY medium "中等">
<!ENTITY small "小型">
]>
<root>
<shop>
<name>物美</name>
<address>文一路</address>
<size>&big;</size>
</shop>
</root>

注意:在实体中可以嵌套,但是不能两个是个实体互相嵌套(死循环了)。

下面正确的引用:

<!ENTITY one “one”>

<!ENTITY two “&one; I am two”>

下面是不正确的引用:

<!ENTITY one “Hello &two;”>

<!ENTITY two “Hello &one”>

参数内部解析实体

参数内部实体相当于DTD代码段的声明。

实例:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ENTITY % shopattr "
<!ELEMENT name (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ELEMENT size (#PCDATA)>
<!ELEMENT pic (#PCDATA)>
<!ELEMENT remark (#PCDATA)>"> <!ELEMENT root (shop)+>
<!ELEMENT shop (name, address, size, pic*, remark?)>
%shopattr; <!--使用参数实体替代--> <!ENTITY big "旗舰店">
<!ENTITY medium "中等">
<!ENTITY small "小型">
]>
<root>
<shop>
<name>物美</name>
<address>文一路</address>
<size>&big;</size>
</shop>
</root>

通用外部解析实体

DTD中引用otherSize.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ELEMENT root (shop)+>
<!ELEMENT shop (name, address, size, pic*, remark?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ELEMENT size (#PCDATA)>
<!ELEMENT pic (#PCDATA)>
<!ELEMENT remark (#PCDATA)>
<!ENTITY big "旗舰店">
<!ENTITY medium "中等">
<!ENTITY small "小型">
<!ENTITY otherSize SYSTEM "otherSize.xml">
]>
<root>
<shop>
<name>物美</name>
<address>文一路</address>
<size>&big;</size>
</shop>
<shop>
<name>联华</name>
<address>文二路</address>
<size>&otherSize;</size>
</shop>
</root>

otherSize.xml

<?xml version="1.0" encoding="utf-8"?>
<option>
big too
</option>
在ie8中显示的效果:

通用外部未解析实体

通用外部未解析实体与其他的类型很相似,区别是XML处理器不会去尝试分析实体的的信息。

通用外部未解析实体的格式:

<!ENTITY 实体名 SYSTEM 二进制数据位置 NDATA 标记名称>

NOTATION指令可以将未解析的二进制实体定义为标记

<!NOTATION 标记名 SYSTEM 标记描述文字>

标记描述文字可以是:

处理现实二进制数据的应用程序

描述格式的网络文件

普通的一段描述性语言

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ELEMENT root (shop)+>
<!ELEMENT shop (name, address, size, pic*, remark?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ELEMENT size (#PCDATA)>
<!ELEMENT pic EMPTY>
<!ATTLIST pic source ENTITY #REQUIRED>
<!NOTATION JPEG SYSTEM "acdsee.exe">
<!ENTITY pic1 SYSTEM "pic1.jpg" NDATA JPEG>
<!ELEMENT remark (#PCDATA)>
<!ENTITY big "旗舰店">
<!ENTITY medium "中等">
<!ENTITY small "小型">
]>
<root>
<shop>
<name>物美</name>
<address>文一路</address>
<size>&big;</size>
<pic source="pic1"/>
</shop>
</root>

参数外部解析实体

使用参数外部解析实体可以方便的组织分布在各个文件中的DTD文件。作用相当的大。

示例:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ROOT [
<!ELEMENT ROOT (A|B)*>
<!ENTITY % A_atrr SYSTEM "A.dtd">
<!ENTITY % B_atrr SYSTEM "B.dtd">
%A_atrr;
%B_atrr;
]>
<ROOT>
<A>
<NAME_A>
I am A!
</NAME_A>
</A>
<B>
<NAME_B>
I am B;
</NAME_B>
</B>
</ROOT>

A.dtd

<?xml version="1.0" encoding="utf-8"?>
<!ELEMENT A (NAME_A)>
<!ELEMENT NAME_A (#PCDATA)>

B.dtd

<?xml version="1.0" encoding="utf-8"?>
<!ELEMENT B (NAME_B)>
<!ELEMENT NAME_B (#PCDATA)>
--------------------------------------------------------------------------
来源于:http://www.cnblogs.com/ygcao/archive/2010/05/02/1726129.html

XML 实体的更多相关文章

  1. XML实体注入漏洞

    XML实体注入漏洞 测试代码1: 新建xmlget.php,复制下面代码 <?php $xml=$_GET['xml']; $data = simplexml_load_string($xml) ...

  2. XML 实体扩展攻击

    XMl Entity Expansion(攻击)某种程度上类似于 XML Entity Expansion,但是它主要试图通过消耗目标程序的服务器环境来进行DOS攻击的.这种攻击基于XML Entit ...

  3. hibernate 非xml实体类配置方法!

    hibernate 非xml实体类配置方法! 这个是hibernate.cfg.xml配置文件 <?xml version='1.0' encoding='UTF-8'?> <!DO ...

  4. XML实体解析器的作用

    XML实体解析器的作用 什么是实体解析器 如果一个sax解析器需要实现对外部实体的自定义处理,那么必须实现一个EntityResolver接口并且注册到SAX驱动上. 从这段文字可以看出来,实体解析器 ...

  5. 小试XML实体注入攻击

    基础知识 XML(Extensible Markup Language)被设计用来传输和存储数据.关于它的语法,本文不准备写太多,只简单介绍一下. XML基本知识 1 2 3 4 5 <?xml ...

  6. XML 实体扩展攻击libxml_disable_entity_loader

    XML 实体扩展攻击libxml_disable_entity_loader https://pay.weixin.qq.com/index.php/public/cms/content_detail ...

  7. 3. XML实体注入漏洞的利用与学习

    XML实体注入漏洞的利用与学习 前言 XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发 ...

  8. 2.XML实体注入漏洞攻与防

    XML实体注入基础 当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件.执行系统命令.探测内网端口.攻击内网网站等危害. 简单了解XML以后,我们知道要在XML中使用特殊字符,需要使用实体字符 ...

  9. Fortify漏洞之XML External Entity Injection(XML实体注入)

    继续对Fortify的漏洞进行总结,本篇主要针对  XML External Entity Injection(XML实体注入) 的漏洞进行总结,如下: 1.1.产生原因: XML External ...

  10. 企业安全01-Apache solr XML实体注入漏洞CVE-2017-12629

    Apache solr XML 实体注入漏洞CVE-2017-12629 一.简介 Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apac ...

随机推荐

  1. 【LeetCode】 Valid Sudoku

    Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...

  2. web.xml文件中context-param、listener、filter、servlet的执行顺序

    首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> ...

  3. ajax如何向后台传递数组,在后台该如何接收的问题(项目积累)

    一.后台如何接收从前台接收的数组: 使用request.getParameterValues(String xxx); <input type="text" name=&qu ...

  4. 跨终端Web

    1.终端vs设备 H5页面运行在同一设备的不同终端下. (1)Web浏览器. (2)微信.QQ浏览器. (3)移动App的Webview. (4)TV机顶盒. 2.跨终端的实现方式 (1)响应式 存在 ...

  5. Redis Sentinel基本介绍(翻译以及总结)

    目录 Redis Sentinel介绍 分布式的Redis Sentinel 快速开始 获取Sentinel 启动Sentinel 部署Sentinel的基本要求 配置Sentinel 其他的Sent ...

  6. C#HttpUtility.UrlEncode 大写问题

    工作上和另一个公司对接,调对方的api需要用到md5加密,加密前要使用HttpUtility.UrlEncode,对方接口一直返回验证错误,定位了问题发现是中文编码使用HttpUtility.UrlE ...

  7. ASP.NET Core 2 学习笔记(四)依赖注入

    ASP.NET Core使用了大量的依赖注入(Dependency Injection, DI),把控制反转(Inversion Of Control, IoC)运用的相当巧妙.DI可算是ASP.NE ...

  8. C# 多线程 弹出模态MessageBox的一种方法

    在多线程中,有时候使用MessageBox.Show方法弹出对话框,弹出的Messagebox不是模态的,不能满足我的要求.经过研究,如下实现 private void button1_Click(o ...

  9. python web开发——c3 数据库交互和flask-SQLALchemy

    ORM(对象关系映射) 定义:将数据库中表与表之间的关系和代码中类(class)与类之间的关系联系起来,这就是ORM

  10. django 模型对象的 update() get_or_create() 的使用

    update() 如果一个查询集是一个列表对象, 需要更新该列表对象里所有的单个数据集的数据,可以使用update()方法,而不须遍历整个查询集对象一个个逐一进行修改 obj_list = UserI ...