【发布时间】:2008-10-21 21:54:58
【问题描述】:
我想知道是否有任何方法可以在 xml 文档的 CDATA 部分中转义 CDATA 结束令牌 (]]>)。或者,更一般地说,如果在 CDATA 中使用了一些转义序列(但如果它存在,我想它可能只对转义开始或结束标记有意义,无论如何)。
基本上,您能否在 CDATA 中嵌入开始或结束标记,并告诉解析器不要对其进行解释,而是将其视为另一个字符序列。
也许,如果您发现自己尝试这样做,您应该重构您的 xml 结构或代码,但即使过去 3 年左右我每天都在使用 xml,而且我从来没有这个问题,我想知道是否可能。只是出于好奇。
编辑:
除了使用 html 编码...
【问题讨论】:
-
首先,我接受正确的答案,但请注意:没有什么可以阻止某人在 CData 中将
>编码为>,以确保嵌入的]]>不会被解析为 CDEnd。它只是意味着它是意外的,&也必须首先编码为&,以便可以正确解码数据。文档的用户也必须知道解码这个 CData。这并非闻所未闻,因为 CData 的部分目的是包含特定消费者了解如何处理的内容。这样的 CData 不能被任何通用消费者正确解释。 -
@nix,CDATA 只是提供了一种明确的方式来声明文本节点内容,这样(除了 ]]>)中的语言标记不会被解析。它特别不扩展像 > 这样的实体引用。因此,在 CDATA 块中,这仅表示这四个字符,而不是“>”。换个角度来看:在 xml 规范中,所有文本内容都称为“cdata”,而不仅仅是这些序列(“字符数据”)。这也与特定的消费代理无关。 (这样的事情确实存在——处理指令()。
-
(我应该补充一点,即使这种事情与节点的初衷背道而驰,但在与 XML 的漫长而痛苦的战斗中一切都是公平的。我只是觉得它可能对读者有用要知道 实际上并不是为此目的而设计的。)
-
@Semicolon
CDATA旨在允许任何东西:它们用于转义包含字符的文本块,否则这些字符会被识别为标记这也意味着CDATA,因为它也是标记。但是,事实上,你不需要我暗示的双重编码。]]>是在CDATA中编码CDEnd的可接受方式。 -
没错,你不需要双重编码——但你仍然需要代理具有特殊知识,因为解析器不会解析 >作为 >。这就是你的意思,我想?解析后可以根据需要替换它们吗?