什么是CDATA区块?何时需要使用?
&amp;amp;amp;lt;blockquote&amp;amp;amp;gt;CDATA区块用于在XML中保留特殊字符原义,避免转义;适用于嵌入代码等含大量特殊字符的文本,提升可读性,但不可嵌套、不能用于属性值,且需防范安全风险。&amp;amp;amp;lt;/blockquote&amp;amp;amp;gt; &amp;amp;amp;lt;p&amp;amp;amp;gt;&amp;amp;amp;lt;img src=”https://img.php.cn/upload/article/001/221/864/175810434371050.jpg” alt=”什么是cdata区块?何时需要使用?”&amp;amp;amp;gt;&amp;amp;amp;lt;/p&amp;amp;amp;gt; &amp;amp;amp;lt;p&amp;amp;amp;gt;简单来说,CDATA区块就是XML里一块“原样输出”的文本区域。它存在的意义,是为了让你在XML文档里能随意写一些含有特殊字符(比如&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;<&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;、&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;>&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;、&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;&amp;amp;amp;amp;&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;)的内容,而不用担心XML解析器会把它们误认为是标签或者实体引用。对我而言,它就像是给XML开辟了一个“私人空间”,里面想放什么就放什么,不用顾虑太多XML本身的语法规则。&amp;amp;amp;lt;/p&amp;amp;amp;gt; &amp;amp;amp;lt;p&amp;amp;amp;gt;当我们面临需要在XML文档中嵌入诸如HTML代码片段、JavaScript脚本、或者甚至是另一段XML文本时,CDATA区块的价值就凸显出来了。试想一下,如果你的JavaScript代码里有&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;if (a < b &amp;amp;amp;amp;&amp;amp;amp;amp; c > d)&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;这样的逻辑,在普通的XML文本节点里,你得把&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;<&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;转义成&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;&amp;amp;amp;lt;&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;,&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;>&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;转义成&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;&amp;amp;amp;gt;&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;,&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;&amp;amp;amp;amp;&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;转义成&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;&amp;amp;amp;amp;&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;。这简直是噩梦!不仅写起来费劲,读起来也头疼。而CDATA区块,就是来终结这种烦恼的。它直接告诉解析器:“嘿,这块内容你别管,就是纯文本,照单全收!”&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=’brush:xml;toolbar:false;’&amp;amp;amp;gt;<scriptCode> <![CDATA[ function processData(value) { if (value === null || value === undefined) { console.error(“Input value is invalid.”); return; } // 这里可以随意写各种特殊字符,比如 < > &amp;amp;amp;amp; ” ‘ // 甚至是HTML片段,例如 <div class=”container”><span>Hello World!</span></div> let result = value * 2; console.log(“Processed result: ” + result); } // 调用示例 processData(10); ]]> </scriptCode>&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;你看,多清爽!&amp;amp;amp;lt;/p&amp;amp;amp;gt; &amp;amp;amp;lt;h3&amp;amp;amp;gt;XML解析器如何“放过”CDATA内部的特殊字符?它究竟是怎么工作的?&amp;amp;amp;lt;/h3&amp;amp;amp;gt; &amp;amp;amp;lt;p&amp;amp;amp;gt;其实这背后没什么特别复杂的魔法,就是XML规范里明确定义了这么一套规则。解析器在遇到&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;<![CDATA[&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;的时候,就切换到一个“纯文本模式”,直到它找到匹配的&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;]]>&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;为止。这段期间,所有它看到的字符,无论是尖括号还是和号,都会被原封不动地收集起来,作为文本内容的一部分。这和它处理普通文本节点时那种“扫描潜在标记和实体”的模式是完全不同的。我个人觉得,这有点像给数据加了个“免检标签”。它不会去解析&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;<![CDATA[&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;和&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;]]>&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;之间的任何内容为XML标记或实体引用,只会将其作为原始的字符数据对待。所以,你在里面写什么,解析出来就是什么。唯一需要注意的是,你不能在CDATA区块内部再出现&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;]]>&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;这个序列,因为这会被解析器认为是CDATA区块的结束符。&amp;amp;amp;lt;/p&amp;amp;amp;gt; &amp;amp;amp;lt;div class=”aritcle_card”&amp;amp;amp;gt; &amp;amp;amp;lt;a class=”aritcle_card_img” href=”/ai/vanceai-image-resizer”&amp;amp;amp;gt;&amp;amp;amp;lt;img src=”https://img.php.cn/upload/ai_manual/001/431/639/68b6c8cc6060a458.png” alt=”VanceAI Image Resizer”&amp;amp;amp;gt;&amp;amp;amp;lt;/a&amp;amp;amp;gt; &amp;amp;amp;lt;div class=”aritcle_card_info”&amp;amp;amp;gt; &amp;amp;amp;lt;a href=”/ai/vanceai-image-resizer”&amp;amp;amp;gt;VanceAI Image Resizer&amp;amp;amp;lt;/a&amp;amp;amp;gt; &amp;amp;amp;lt;p&amp;amp;amp;gt;VanceAI推出的在线图片尺寸调整工具&amp;amp;amp;lt;/p&amp;amp;amp;gt; &amp;amp;amp;lt;div class=””&amp;amp;amp;gt; &amp;amp;amp;lt;img src=”/static/images/card_xiazai.png” alt=”VanceAI Image Resizer”&amp;amp;amp;gt;&amp;amp;amp;lt;span&amp;amp;amp;gt;27&amp;amp;amp;lt;/span&amp;amp;amp;gt; &amp;amp;amp;lt;/div&amp;amp;amp;gt; &amp;amp;amp;lt;/div&amp;amp;amp;gt; &amp;amp;amp;lt;a href=”/ai/vanceai-image-resizer” class=”aritcle_card_btn”&amp;amp;amp;gt; &amp;amp;amp;lt;span&amp;amp;amp;gt;查看详情&amp;amp;amp;lt;/span&amp;amp;amp;gt; &amp;amp;amp;lt;img src=”/static/images/cardxiayige-3.png” alt=”VanceAI Image Resizer”&amp;amp;amp;gt;&amp;amp;amp;lt;/a&amp;amp;amp;gt; &amp;amp;amp;lt;/div&amp;amp;amp;gt; &amp;amp;amp;lt;h3&amp;amp;amp;gt;CDATA区块和使用实体引用(如&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;&amp;amp;amp;lt;&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;)来转义特殊字符,我到底该选哪个?&amp;amp;amp;lt;/h3&amp;amp;amp;gt; &amp;amp;amp;lt;p&amp;amp;amp;gt;这真是个老生常谈的问题,尤其是在处理XML数据的时候。我的经验是,没有绝对的“最佳”选择,只有“最适合”的场景。如果你要嵌入的是一大段代码、一段HTML片段,或者其他任何本身就含有大量XML特殊字符的文本,毫不犹豫地用CDATA。它能极大提升代码的可读性和维护性。想象一下,如果把一段JavaScript代码里的所有&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;<&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;和&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;>&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;都转义一遍,那简直是灾难。但如果只是在普通文本里偶尔出现一个&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;&amp;amp;amp;amp;&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;或者&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;<&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;,比如“A &amp;amp;amp;amp;amp; B”,那用&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;&amp;amp;amp;amp;&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;就足够了,甚至更清晰,因为这明确告诉读者和解析器,这里确实就是一个“和”符号,而不是潜在的标记开始。而且,CDATA不能用于属性值,这一点要记住,属性值必须使用实体引用。比如&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;<element attr=”A &amp;amp;amp;amp; B”/>&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;是正确的,而&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;<element attr=”<![CDATA[A &amp;amp;amp;amp; B]]>”/>&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;则是错误的。所以,选择哪个,更多是看你内容的性质和量。&amp;amp;amp;lt;/p&amp;amp;amp;gt; &amp;amp;amp;lt;h3&amp;amp;amp;gt;使用CDATA区块时,有哪些隐藏的“坑”和值得注意的最佳实践?&amp;amp;amp;lt;/h3&amp;amp;amp;gt; &amp;amp;amp;lt;p&amp;amp;amp;gt;虽然CDATA区块能解决不少麻烦,但它也不是万能药,用不好反而会带来新的问题。最常见的一个“坑”就是CDATA区块不能嵌套。也就是说,你不能在&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;<![CDATA[&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;和&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;]]>&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;之间再放一个&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;<![CDATA[&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;。如果你的内容本身就包含了&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”code” style=”position:relative; padding:0px; margin:0px;”&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=”brush:php;toolbar:false;”&amp;amp;amp;gt;]]>&amp;amp;amp;lt;/pre&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;div class=”contentsignin”&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt;这个序列,那你就得想办法了,比如拆分成多个CDATA区块,或者干脆回归实体引用。&amp;amp;amp;lt;/p&amp;amp;amp;gt; &amp;amp;amp;lt;p&amp;amp;amp;gt;再一个,安全问题不容忽视。如果你把用户输入的内容直接扔进CDATA区块,而这些内容又可能包含恶意脚本,那就可能导致XSS攻击。所以,即使在CDATA里,对输入内容进行适当的清理和验证仍然是不可或缺的。我见过不少开发者,为了省事,什么都往CDATA里塞,结果导致XML文件变得异常臃肿,可读性也直线下降。我的建议是,只在确实需要规避XML解析器对特殊字符的默认处理时才使用CDATA,并且尽量保持其内容的简洁和聚焦。别把它当成一个“垃圾桶”。它是一个&amp;amp;amp;lt;a &amp;amp;amp;gt;工具&amp;amp;amp;lt;/a&amp;amp;amp;gt;,用得好能事半功倍,用不好则可能带来新的困扰。&amp;amp;amp;lt;/p&amp;amp;amp;gt;

javascript java html 工具 ai xml解析 JavaScript html xss if xml

上一篇
下一篇