解析 Atom XML 源时,应如何处理冲突的 CDATA 和实体转义元素


Atom 提要

解析器应如何处理提要中的以下 XML 行:

<title type="html"><![CDATA[Johnson &amp; Johnson]]></title>

为了便于讨论,让我们假设最初预期的文本实际上是Johnson & Johnson . 我在网上遇到了关于这个问题的讨论,似乎有两种不同的意见:

1. 意见 #1 - 声称此内容是双重编码的。 文本"Johnson & Johnson"文本已被实体转义,然后通过包装在 CDATA 部分中再次编码。 他指出,一个行为良好的xml解析器将返回Johnson &amp; Johnson,因为这是XML规范规定CDATA编码数据应该被处理的方式。

  1. 意见 #2 - 声称 Atom 规范优先。 他指出,CDATA充当直通。 Johnson &amp; Johnson出来Johnson &amp; Johnson.如果这只是一个 XML 文档,它将到此结束。但是,因为它是 Atom,我们必须查看 Atom 规范以确定正确的行为。 原子规范指出,任何具有type="html"的元素都包含实体转义的 html。 因此,我们应该可以自由地解码它。

以下哪一项事实正确? 如果一个合适的 Atom XML 解析器产生: Johnson & JohnsonJohnson &amp; Johnson鉴于这种特殊情况?

两种观点都是正确的:

  • 编码为文本的标题Johnson & Johnson
  • 编码为 HTML 的标题Johnson &amp; Johnson
  • 在 XML 中编码为 HTML 的标题<![CDATA[Johnson &amp; Johnson]]>

CDATA 标记之间的内容不会针对标记的实体进行分析,因此文本节点的解析值Johnson &amp; Johnson

请注意,该属性表示type="html",因此应将其解析为HTML。

例如,如果你把它表达为一个网页,你可以写:

<h1>Johnson &amp; Johnson</h1>

如果它说type="text"那么您需要将纯文本编码为 HTML,这将为您提供:

<h1>Johnson &amp;amp; Johnson</h1>

CDATA 是字符数据 - 被 <![CDATA]> 之间的解析器完全忽略。必须是因为 xml 无法处理&amp; .因此,没有"双重编码" - 任何解析器都会跳到关闭标记,忽略两者之间的任何内容。我还没有遇到允许实际嵌套的解析器(嵌入式完整的 CDATA 打开和关闭标签)。

最新更新