0%

xml中的转义字符

XML 中的转义字符与 CDATA 区块

在 XML 文档中,某些字符具有特殊含义(如<>用于标记元素边界),直接使用会导致解析错误。为了正确表示这些特殊字符,XML 提供了两种解决方案:转义字符CDATA 区块

XML 转义字符

XML 预定义了 5 个转义字符(实体引用),用于表示在 XML 中有特殊含义的字符:

转义字符 对应原字符 说明
&amp; & 表示和号(AND 符号)
&lt; < 表示小于号
&gt; > 表示大于号
&quot; " 表示双引号
&apos; ' 表示单引号(撇号)

转义字符的使用场景

当文本中包含上述特殊字符时,必须使用转义字符替代,否则 XML 解析器会将其误认为 XML 语法的一部分,导致解析错误。

示例

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<note>
<description>
比较结果:3 &lt; 5 &amp; 10 &gt; 7 <!-- 正确:使用转义字符表示<、&、> -->
</description>
<quote>
他说:&quot;Hello World!&quot; <!-- 正确:使用转义字符表示双引号 -->
</quote>
</note>

错误示例(未转义导致解析失败):

1
2
<!-- 错误:<和>会被误认为元素标记 -->
<description>3 < 5 & 10 > 7</description>

CDATA 区块

当文本中包含大量特殊字符(如代码片段、公式等)时,逐个转义会非常繁琐。XML 提供了CDATA 区块(Character Data),用于标识一段无需解析的原始文本,解析器会将其中的内容原样保留。

CDATA 的语法格式

1
<![CDATA[ 文本内容 ]]>
  • <!CDATA[:CDATA 区块的开始标记。
  • ]]>:CDATA 区块的结束标记(必须连续,不能有空格)。
  • 中间的文本内容可以包含任意字符(除]]>外),包括<>&等特殊字符,解析器不会对其进行解析。

CDATA 的使用场景

  1. 包含大量特殊字符的文本:如 HTML 代码片段、SQL 语句、数学公式等。

    示例(嵌入 HTML 代码):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0"?>
    <document>
    <html-snippet>
    <![CDATA[
    <h1>标题</h1>
    <p>内容包含&符号和<标签></p>
    ]]>
    </html-snippet>
    </document>
  2. 避免转义的繁琐:当文本中存在多个需要转义的字符时,CDATA 可简化书写。

    示例

    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0"?>
    <code>
    <![CDATA[
    if (a < b && c > d) {
    System.out.println("条件成立");
    }
    ]]>
    </code>

CDATA 的注意事项

  • 不能嵌套:CDATA 区块中不能包含]]>,否则解析器会误认为区块结束。

  • 仅适用于文本内容:CDATA 只能用于元素的文本内容,不能用于属性值(属性值中必须使用转义字符)。

    错误示例(属性中使用 CDATA):

    1
    2
    <!-- 错误:属性值中不能使用CDATA -->
    <tag attr="<![CDATA[包含&符号]]>"></tag>

    正确示例(属性中使用转义字符):

    1
    <tag attr="包含&amp;符号"></tag>  <!-- 正确:用&amp;表示& -->

转义字符与 CDATA 的对比

特性 转义字符 CDATA 区块
使用场景 少量特殊字符 大量特殊字符或代码片段
书写复杂度 需逐个替换,较繁琐 一次性包裹,简单高效
适用位置 文本内容和属性值 仅文本内容(不能用于属性)
限制 仅支持 5 个预定义字符 不能包含]]>

选择建议

  • 少量特殊字符(如单个<&):使用转义字符。
  • 大量特殊字符或代码片段:使用 CDATA 区块。
  • 属性值中:必须使用转义字符,不能使用 CDATA

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10