XML中的实体引用(Entity Reference)有哪些?怎么定义自定义实体?(实体.自定义.定义.引用.有哪些...)

wufei123 发布于 2025-08-29 阅读(8)
XML中的实体引用(Entity Reference)有哪些?怎么定义自定义实体?(实体.自定义.定义.引用.有哪些...)
&amp;amp;lt;p&amp;amp;gt;xml中的实体引用是一种代码复用和特殊字符处理机制,主要分为预定义实体引用(如<、>、&amp;amp;amp;等)、字符实体引用(如&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;img src=&quot;https://img.php.cn/upload/article/001/221/864/175421964639365.jpg&quot; alt=&quot;XML中的实体引用(Entity Reference)有哪些?怎么定义自定义实体?&quot;&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;XML中的实体引用,说白了,就是一种偷懒的方式,或者说,一种代码复用的方式。它们允许你在XML文档中插入预定义的文本片段,避免重复输入相同的内容。当然,更重要的是,它们可以用来引用特殊字符,比如 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;<&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 或 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;,这些字符在XML中有特殊的含义。&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;h3&amp;amp;gt;解决方案&amp;amp;lt;/h3&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;XML实体引用主要分为以下几种:&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;ol&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;预定义实体引用:&amp;amp;lt;/strong&amp;amp;gt; 这是XML规范自带的,可以直接使用。最常见的有:&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;ul&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&amp;amp;lt;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 代表小于号 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;<&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&amp;amp;gt;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 代表大于号 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&amp;amp;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 代表与符号 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&amp;amp;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&amp;amp;apos;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 代表单引号 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;'&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&quot;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 代表双引号 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&quot;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;/ul&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;这些预定义实体,你无需任何声明,直接就能在XML文档中使用。&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;字符实体引用:&amp;amp;lt;/strong&amp;amp;gt; 这种引用方式使用Unicode字符的十进制或十六进制表示。例如,&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&amp;amp;lt;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 和 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&amp;amp;lt;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 都代表小于号 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;<&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;。 这种方式可以表示任何Unicode字符,非常灵活。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;内部实体引用:&amp;amp;lt;/strong&amp;amp;gt; 这是你可以在XML文档内部定义的实体。 它允许你用一个简短的名称来代表一段文本。 定义方式如下:&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class='brush:xml;toolbar:false;'&amp;amp;gt;<!DOCTYPE root [ <!ENTITY myEntity &quot;This is my entity text.&quot;> ]> <root> <element>&amp;amp;myEntity;</element> </root>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;在这个例子中,&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;<!ENTITY myEntity &quot;This is my entity text.&quot;>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 定义了一个名为 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;myEntity&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 的内部实体,它的值是 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&quot;This is my entity text.&quot;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;。 在XML文档中,你可以使用 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&amp;amp;myEntity;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 来引用这段文本。&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;外部实体引用:&amp;amp;lt;/strong&amp;amp;gt; 这种实体引用指向外部文件。 它允许你将XML文档的一部分内容放在单独的文件中,然后在主文档中引用它。 定义方式如下:&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class='brush:xml;toolbar:false;'&amp;amp;gt;<!DOCTYPE root [ <!ENTITY extEntity SYSTEM &quot;external.txt&quot;> ]> <root> <element>&amp;amp;extEntity;</element> </root>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;在这个例子中,&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;<!ENTITY extEntity SYSTEM &quot;external.txt&quot;>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 定义了一个名为 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;extEntity&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 的外部实体,它指向名为 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;external.txt&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 的文件。 在XML文档中,你可以使用 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&amp;amp;extEntity;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 来引用这个文件的内容。&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;注意:&amp;amp;lt;/strong&amp;amp;gt; 使用外部实体引用时,需要注意安全问题,特别是当XML文档来自不可信的来源时。 恶意攻击者可能会利用外部实体引用来读取服务器上的敏感文件,或者执行恶意代码。&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;/ol&amp;amp;gt; &amp;amp;lt;h3&amp;amp;gt;如何定义自定义实体?&amp;amp;lt;/h3&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;定义自定义实体,其实就是在XML文档的DTD(Document Type Definition)中声明实体。 DTD可以嵌入在XML文档中(内部DTD),也可以放在单独的文件中(外部DTD)。&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;1. 内部DTD中的实体定义:&amp;amp;lt;/strong&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;上面已经展示了内部实体的定义方式。 关键在于 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;<!DOCTYPE root [ ... ]>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 这个部分,它定义了文档类型,并且可以在方括号内声明实体。 实体声明的语法是 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;<!ENTITY entityName &quot;entityValue&quot;>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;。&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;2. 外部DTD中的实体定义:&amp;amp;lt;/strong&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;如果想把实体定义放在单独的文件中,可以这样做:&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;ul&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;创建DTD文件 (例如:&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;myentities.dtd&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;):&amp;amp;lt;/strong&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class='brush:xml;toolbar:false;'&amp;amp;gt;<!ENTITY copyright &quot;Copyright 2023 MyCompany&quot;> <!ENTITY version &quot;1.0&quot;>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;在XML文档中引用DTD文件:&amp;amp;lt;/strong&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class='brush:xml;toolbar:false;'&amp;amp;gt;<!DOCTYPE root SYSTEM &quot;myentities.dtd&quot;> <root> <element>&amp;amp;copyright;</element> <version>&amp;amp;version;</version> </root>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;这里的 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;<!DOCTYPE root SYSTEM &quot;myentities.dtd&quot;>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 告诉XML解析器去读取 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;myentities.dtd&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 文件,并使用其中定义的实体。&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;/ul&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;一些注意事项:&amp;amp;lt;/strong&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;ul&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;实体名称必须以字母开头,可以包含字母、数字、句点和连字符。&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;实体值可以是任何文本,包括其他实体引用。&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;使用外部实体时,确保DTD文件的路径是正确的,并且XML解析器有权访问该文件。&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;为了避免命名冲突,最好为实体名称添加前缀或后缀。&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;/ul&amp;amp;gt; &amp;amp;lt;h3&amp;amp;gt;XML实体引用有什么实际应用场景?&amp;amp;lt;/h3&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;XML实体引用在很多场景下都非常有用。&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;ul&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;代码复用:&amp;amp;lt;/strong&amp;amp;gt; 避免重复输入相同的文本,提高开发效率。 例如,可以在DTD中定义公司的名称、地址等信息,然后在XML文档中多次引用。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;特殊字符处理:&amp;amp;lt;/strong&amp;amp;gt; 方便地插入XML保留字符,例如 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;<&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;、&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;>&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;、&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;&amp;amp;&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 等。 这对于生成包含XML代码的XML文档非常有用。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;国际化和本地化:&amp;amp;lt;/strong&amp;amp;gt; 可以使用实体引用来存储不同语言的文本,然后根据用户的语言设置选择合适的实体。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;版本控制:&amp;amp;lt;/strong&amp;amp;gt; 可以将版本号定义为实体,方便在XML文档中更新版本信息。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;配置管理:&amp;amp;lt;/strong&amp;amp;gt; 可以使用外部实体引用来加载配置文件,例如数据库连接信息、API密钥等。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;/ul&amp;amp;gt; &amp;amp;lt;h3&amp;amp;gt;如何防止XML实体注入攻击?&amp;amp;lt;/h3&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;XML实体注入(XXE)是一种常见的安全漏洞,攻击者可以利用它来读取服务器上的敏感文件,甚至执行恶意代码。 为了防止XXE攻击,可以采取以下措施:&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;ul&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;禁用外部实体引用:&amp;amp;lt;/strong&amp;amp;gt; 这是最有效的防御方法。 大多数XML解析器都允许你禁用外部实体引用。 例如,在Java中,可以使用 &amp;amp;lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&amp;amp;gt;&amp;amp;lt;pre class=&quot;brush:php;toolbar:false;&quot;&amp;amp;gt;XMLReaderFactory&amp;amp;lt;/pre&amp;amp;gt;&amp;amp;lt;div class=&quot;contentsignin&quot;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt; 来创建一个禁用外部实体引用的XML解析器。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;使用安全的XML解析器:&amp;amp;lt;/strong&amp;amp;gt; 选择一个经过安全审计的XML解析器,并确保它是最新版本。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;验证XML文档:&amp;amp;lt;/strong&amp;amp;gt; 在解析XML文档之前,对其进行验证,确保它符合预期的格式和内容。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;限制XML解析器的权限:&amp;amp;lt;/strong&amp;amp;gt; 确保XML解析器只能访问必要的文件和资源。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;使用白名单:&amp;amp;lt;/strong&amp;amp;gt; 只允许使用预定义的实体引用,禁止使用自定义实体引用。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;/ul&amp;amp;gt; &amp;amp;lt;h3&amp;amp;gt;内部实体和外部实体,我应该选择哪种?&amp;amp;lt;/h3&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;选择内部实体还是外部实体,取决于你的具体需求。&amp;amp;lt;/p&amp;amp;gt; &amp;amp;lt;ul&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;内部实体:&amp;amp;lt;/strong&amp;amp;gt; 适合于定义较短的、在单个XML文档中使用的文本片段。 它们易于定义和使用,但可重用性较差。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;外部实体:&amp;amp;lt;/strong&amp;amp;gt; 适合于定义较长的、在多个XML文档中使用的文本片段。 它们具有更好的可重用性,但需要额外的文件管理。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt; &amp;amp;lt;/ul&amp;amp;gt; &amp;amp;lt;p&amp;amp;gt;一般来说,如果你的实体只在一个XML文档中使用,并且内容比较短,那么使用内部实体就足够了。 如果你的实体需要在多个XML文档中使用,或者内容比较长,那么使用外部实体会更好。 但是,在使用外部实体时,一定要注意安全问题,采取必要的措施来防止XXE攻击。&amp;amp;lt;/p&amp;amp;gt;

以上就是XML中的实体引用(Entity Reference)有哪些?怎么定义自定义实体?的详细内容,更多请关注知识资源分享宝库其它相关文章!

标签:  实体 自定义 定义 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。