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

时间:2016-04-22 17:51:05

标签: xml feed cdata atom-feed xml-encoding

Atom订阅源解析器应如何处理订阅源中的以下XML行:

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

为了便于讨论,我们假设最初预期的文本实际上是Johnson & Johnson。我遇到了关于这个问题的online discussion,似乎有两种不同的观点:

  1. Opinion #1 - claims that this content is double-encoded。文本“Johnson&amp; Johnson”文本已被实体转义,然后通过包装在CDATA部分中再次编码。他声明一个表现良好的xml解析器将返回Johnson &amp; Johnson,因为这是XML spec状态CDATA编码数据的处理方式。

  2. Opinion #2 - claims that the Atom spec takes precedent。他声称CDATA是一个传播途径。 Johnson &amp; JohnsonJohnson &amp; Johnson出现。如果这只是一个XML文档,它将在那里结束。但是,因为它是Atom,我们必须查看Atom spec以确定正确的行为。原子规范声明任何带有type="html"的元素都包含实体转义的html。因此,我们应该可以自由解码。

  3. 其中哪一项事实上是正确的?应该使用适当的Atom XML解析器: 考虑到这种特殊情况,Johnson & JohnsonJohnson &amp; Johnson

3 个答案:

答案 0 :(得分:1)

两种观点都是正确的:

  • 编码为文字的标题为Johnson & Johnson
  • 编码为HTML的标题为Johnson &amp; Johnson
  • 以XML格式编码为HTML的标题为<![CDATA[Johnson &amp; Johnson]]>

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

e.g。如果您将此表示为网页,则可以写下:

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

如果它已经说过type="text"那么你需要将纯文本编码为HTML,它会给你:

<h1>Johnson &amp;amp; Johnson</h1>
相关问题