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

实体可以分为通用实体和参数实体。通用实体用于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. ORA-20002: [WF_NO_USER] NAME=<name> ORIG_SYSTEM=NULL ORIG_SYSTEM_ID=NULL

    Solution APPLIES TO: Identity Manager Connector - Version 10.1.2 to 10.1.2Oracle User Management - V ...

  2. Java面向接口编程【精品博客】

    我们从生活中去理解面向接口编程,以下举例四个案例来理解: 案例一(汽车案例): /** * 汽车标准接口 * @author Liudeli */ public interface ICar { /* ...

  3. Android Studio 集成 TFS,实现安卓移动开发的持续集成和交付(DevOps)

    目录 1 集成TFS系统.... 1.1 概述.... 1.2 安装TFS插件.... 1.2.1 在线安装方式.... 1.2.2 离线安装方案.... 1.3 常见操作.... 1.3.1 新建G ...

  4. Git提取两次提交的差异文件

    1. 创建清单文件 获取两次提交之间的文件差异,并将文件清单保存到diff.txt文件中 Git diff --name-only 173d3010 18586360 > diff.txt 2. ...

  5. HttpWebRequest 模拟浏览器访问网站

    最近抓网页时报错: 要么返回 The remote server returned an error: (442)要么返回: 非法访问,您的行为已被WAF系统记录! 想了想,就当是人家加了抓网页的东西 ...

  6. Linux(Debian)网卡设置

    debian IP地址配置 vim /etc/network/interface   配置网卡eth0的IP地址 auto eth0 表示网卡随系统自动请 iface eth0 inet static ...

  7. C# 一些代码小结--串口操作

    串口解析显示中文 private String SerialPortReadStr() { try { String str = null; int n = serialPort1.BytesToRe ...

  8. Docker之存储管理

    本文由作者邹珍珍授权网易云社区发布. 本文主要介绍Docker的存储管理.Docker拥有镜像分层,写时复制机制以及内容寻址存储等特征,为了支持这些特征,Docker设计了一套镜像元数据管理机制来管理 ...

  9. MYsql 之单标查询.

    http://www.cnblogs.com/wangfengming/articles/8064956.html .数据操作 .增 INSERT into t2(name,age) VALUES() ...

  10. python 神经网络包 NeuroLab

    neurolab模块相当于Matlab的神经网络工具箱(NNT) neurolab模块支持的网络类型: 单层感知机(single layer perceptron) 多层前馈感知机(Multilaye ...