2016-04-22 27 views
1

Atom提要解析器应如何处理XML的下面一行在饲料:解析Atom XML提要时,应如何处理冲突的CDATA和实体转义元素?

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

为了讨论的缘故,让我们假设最初预期的文本实际上Johnson & Johnson。我碰到这个online discussion来到这个问题,好像有2个不同的观点:

  1. Opinion #1 - claims that this content is double-encoded。文本“约翰逊&约翰逊”文本已被实体转义,然后通过包装在CDATA节再次编码。他指出,行为良好的xml解析器将返回Johnson &amp; Johnson,因为XML spec状态应该如何处理CDATA编码数据。

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

其中这些事实上是正确的?如果适当的Atom XML解析器产生: Johnson & JohnsonJohnson &amp; Johnson给出这种特殊情况?

回答

0

CDATA是字符数据 - 完全被解析器忽略。它必须是因为XML不能处理&。因此,不存在“双重编码” - 任何解析器跳到关闭标记,忽略其中的任何内容。我还没有遇到过允许实际嵌套的解析器(嵌入式完整CDATA开放和关闭标签)。

0

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

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

例如如果你是在表达这样一个网页,你可能会这样写:

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

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

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

你的声明“所以应该再被解析为HTML”就是模糊进来我。如果Atom库(通常用于'type =“html”'元素)在没有CDATA的情况下对其元素的文本进行html解码,那么您是否声明它也应该对包装在CDATA中的元素文本进行html解码? – mmcdole

+0

*如果Atom库,通常为type =“html”* - Atom库不应该,HTML呈现器应该。 – Quentin

+0

当规范明确指出它们被转义出来时,为什么Feed提取解析器库不应该自己去标记为'type =“html”'的元素?当您询问Python的'feedparser'库或PHP的'Simplepie'库时,将其标题定义为:'的标题返回为'Title'。示例<p>标题</p > ',他们将全部返回'Example

title

'。这个问题围绕着CDATA元素是否应该规避他们在将数据解析为非转义形式时所做的典型的解决方案。 – mmcdole

0

两个意见是正确的:

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