XML中的转义字符和CDATA表示

本文深入探讨了XML解析的基本原理,包括如何解析PCDATA和忽略CDATA区段中的文本。同时介绍了转义字符的使用及注意事项,以及如何正确处理包含特殊字符的文本。
 

XML CDATA

所有 XML 文档中的文本均会被解析器解析。

只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。

PCDATA

PCDATA 指的是被解析的字符数据(Parsed Character Data)。

XML 解析器通常会解析 XML 文档中所有的文本。

当某个 XML 元素被解析时,其标签之间的文本也会被解析:

<message>此文本也会被解析</message>

解析器之所以这么做是因为 XML 元素可包含其他元素,就像这个例子中,其中的 <name> 元素包含着另外的两个元素(first 和 last):

<name><first>Bill</first><last>Gates</last></name>

而解析器会把它分解为像这样的子元素:

<name>
   <first>Bill</first>
   <last>Gates</last>
</name>

转义字符

非法的 XML 字符必须被替换为实体引用(entity reference)。

假如您在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。因此你不能这样写:

<message>if salary < 1000 then</message>

为了避免此类错误,需要把字符 "<" 替换为实体引用,就像这样:

<message>if salary &lt; 1000 then</message>

在 XML 中有 5 个预定义的实体引用:

&lt;<小于
&gt;>大于
&amp;&和号
&apos;'省略号
&quot;"引号

注释:严格地讲,在 XML 中仅有字符 "<"和"&" 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。

CDATA

术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。

在 XML 元素中,"<" 和 "&" 是非法的。

"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。

"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。

某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。

CDATA 部分中的所有内容都会被解析器忽略。

CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:

<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
  {
  return 1;
  }
else
  {
  return 0;
  }
}
]]>
</script>

在上面的例子中,解析器会忽略 CDATA 部分中的所有内容。

关于 CDATA 部分的注释:

CDATA 部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。

标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。

<think>我们正在讨论XML转义字符。根据引用内容,XML中有五个预定义的转义字符(实体引用): 1. `<` 代表小于号 `<` 2. `>` 代表大于号 `>` 3. `&` 代表号 `&` 4. `&apos;` 代表单引号 `'` 5. `"` 代表双引号 `"` 这些符在XML中具有特殊含义,因此当它们作为文本内容出现时,必须进行转义。 另外,引用[3]中提到:在XML文档中,这些特殊符如果不转义,可能会导致解析错误。例如: - `<` `>` 用于标签的开始结束,所以如果文本中需要包含这些符,就必须转义。 - `&` 用于开始实体引用,所以也必须转义。 - 单引号双引号在属性值中可能会引起属性值的结束,所以也需要转义。 但是,需要注意的是,在XML中,单引号双引号并非在所有情况下都必须转义。例如,如果属性值使用双引号包裹,那么属性值内部的双引号就需要转义,而单引号可以不转义;反之亦然。 引用[4]中提到:XML使用的符集是Unicode(与HTML的ISO Latin-1不同),并且特别指出,不合法的XML符必须被替换为相应的实体。 另外,引用[5]中提到了在Android布局文件中使用转义字符的例子,如尖括号需要转义。 综上所述,XML中必须转义符是:`<`, `>`, `&`, `'`, `"`。 因此,我们可以这样总结: XML中需要转义符有5个,它们对应的实体引用如下: | 符 | 实体引用 | |------|----------| | < | `<` | | > | `>` | | & | `&` | | " | `"`| | ' | `&apos;`| 注意:在XML中,符实体引用也可以使用数形式的符引用,例如`<`代表`<`,但通常我们使用上述助记符形式。 此外,还需要注意,XML中不允许使用某些控制符(如ASCII值在0到31之间的符,除了制表符、换行符回车符),这些符不能直接出现在XML文档中,如果必须出现,则需要通过其他方式(如使用CDATA块或转义为数实体)来处理。 但是,根据问题,我们只关注需要转义的特殊符(即上述5个)。 最后,生成相关问题。 </think>在 XML 中,需要转义符共有 5 个特殊符,它们在 XML 解析中具有特定功能含义。当这些符需要作为普通文本内容出现时,必须使用对应的实体引用(转义序列)表示: ### XML 必须转义的 5 个符及对应实体 | 原始符 | 实体引用 | 说明 | |----------|----------|------| | `<` | `<` | 小于号(标签开始符号) | | `>` | `>` | 大于号(标签结束符号) | | `&` | `&` | 号(实体引用起始符) | | `"` | `"` | 双引号(属性值定界符) | | `'` | `&apos;` | 单引号(属性值定界符) | ### 为何需要转义? 1. **避免解析冲突** XML 将 `<` `>` 作为标签界定符。若文本中直接出现 `<data>10>5</data>`,解析器会将 `>5</data>` 识别为标签导致错误[^3]。 2. **防止实体误解析** `&` 是实体引用起始符。文本中的 `AT&T` 需写作 `AT&T`,否则解析器会将 `&T` 视为未定义实体引用[^2]。 3. **属性值完整性** 属性值需用 `"` 或 `'` 包裹。若值本身包含引号: ```xml <!-- 错误 --> <msg text="He said "Hello!""/> <!-- 正确 --> <msg text="He said "Hello!""/> ``` ### 特殊场景处理 - **CDATA 区块**:包含大量特殊符时可用 `]]>` 包裹原始内容 ```xml <code><![CDATA[if (a < b && b > c) { ... }]]></code> ``` - **数符引用**:支持 Unicode 编码形式 `©` 可写作 `©` 或 `©` - **控制符**:ASCII 0-31(除制表/换行/回车)禁止直接使用 > 示例:包含所有特殊符的 XML 片段 > ```xml > <example> > <tag> 显示标签需转义 </tag> > &amp; 显示为 & > "引号" &apos;撇号&apos; > </example> > ``` ### 注意事项 1. 实体引用**区分大小写**:`&AMP;` 无效,必须用 `&`[^1] 2. 结尾必须有分号:`&lt`(无效) vs `<`(有效) 3. 未转义字符会导致 XML 解析错误(文档无效)[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值