解析器应如何处理提要中的以下 XML 行:
<title type="html"><![CDATA[Johnson & Johnson]]></title>
为了便于讨论,让我们假设最初预期的文本实际上是Johnson & Johnson
. 我在网上遇到了关于这个问题的讨论,似乎有两种不同的意见:
1. 意见 #1 - 声称此内容是双重编码的。 文本"Johnson & Johnson"文本已被实体转义,然后通过包装在 CDATA 部分中再次编码。 他指出,一个行为良好的xml解析器将返回Johnson & Johnson
,因为这是XML规范规定CDATA编码数据应该被处理的方式。
- 意见 #2 - 声称 Atom 规范优先。 他指出,CDATA充当直通。
Johnson & Johnson
出来Johnson & Johnson
.如果这只是一个 XML 文档,它将到此结束。但是,因为它是 Atom,我们必须查看 Atom 规范以确定正确的行为。 原子规范指出,任何具有type="html"
的元素都包含实体转义的 html。 因此,我们应该可以自由地解码它。
以下哪一项事实正确? 如果一个合适的 Atom XML 解析器产生: Johnson & Johnson
或Johnson & Johnson
鉴于这种特殊情况?
两种观点都是正确的:
- 编码为文本的标题
Johnson & Johnson
。 - 编码为 HTML 的标题
Johnson & Johnson
- 在 XML 中编码为 HTML 的标题
<![CDATA[Johnson & Johnson]]>
CDATA 标记之间的内容不会针对标记的实体进行分析,因此文本节点的解析值Johnson & Johnson
。
请注意,该属性表示type="html"
,因此应将其解析为HTML。
例如,如果你把它表达为一个网页,你可以写:
<h1>Johnson & Johnson</h1>
如果它说type="text"
那么您需要将纯文本编码为 HTML,这将为您提供:
<h1>Johnson &amp; Johnson</h1>
CDATA 是字符数据 - 被 <![CDATA
和 ]>
之间的解析器完全忽略。必须是因为 xml 无法处理&
.因此,没有"双重编码" - 任何解析器都会跳到关闭标记,忽略两者之间的任何内容。我还没有遇到允许实际嵌套的解析器(嵌入式完整的 CDATA 打开和关闭标签)。