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

解析Atom XML提要时,应该如何处理冲突的CDATA和实体转义元素?,xml,feed,cdata,atom-feed,xml-encoding,Xml,Feed,Cdata,Atom Feed,Xml Encoding,Atom提要解析器应该如何处理提要中的以下XML行: <title type="html"><![CDATA[Johnson &amp; Johnson]]></title> 为了便于讨论,让我们假设最初预期的文本实际上是强生公司。我在这个问题上遇到了这个问题,似乎有两种不同的观点: 。文本“Johnson&Johnson”已被实体转义,然后通过包装在CDATA节中再次编码。他指出,一个行为良好的xml解析器将返回Johnson&;John

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

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

为了便于讨论,让我们假设最初预期的文本实际上是强生公司。我在这个问题上遇到了这个问题,似乎有两种不同的观点:

  • 。文本“Johnson&Johnson”已被实体转义,然后通过包装在CDATA节中再次编码。他指出,一个行为良好的xml解析器将返回
    Johnson&;Johnson
    ,因为这是处理状态CDATA编码数据的方式

  • 。他表示CDATA充当传递<代码>强生公司;强生公司以强生&;约翰逊。如果这只是一个XML文档,那么它将到此结束。然而,因为它是原子,所以我们必须观察原子,以确定正确的行为。atom规范声明任何带有
    type=“html”
    的元素都包含实体转义html。因此,我们应该可以自由地解码它

  • 以下哪项事实上是正确的?适当的Atom XML解析器应产生:
    Johnson&Johnson
    Johnson&;约翰逊
    考虑到这种特殊情况

    CDATA是字符数据-被解析器完全忽略。它必须是,因为xml不能处理&。因此,不存在“双重编码”——任何解析器都会跳过close标记,忽略两者之间的任何内容。我没有遇到过允许实际嵌套(嵌入完整CDATA打开和关闭标记)的解析器。

    CDATA标记之间的内容没有针对标记实体进行解析,因此文本节点的解析值为
    Johnson&;约翰逊

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

    e、 g.如果您将其表达为网页,您可以写:

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

    两种观点都是正确的:

    • 编码为文本的标题为
      Johnson&Johnson
    • 编码为HTML的标题是
      Johnson&;约翰逊
    • 在XML中编码为HTML的标题是

    您的语句“因此应该将其解析为HTML”让我产生了歧义。如果Atom库(通常用于
    type=“html”
    元素)在没有CDATA的情况下会对其元素的文本进行html解码,您是否认为它也应该对包装在CDATA中的元素文本进行html解码?如果Atom库(通常用于type=“html”)不应该,HTML呈现程序应该这样做。为什么提要解析器库不应该将标记为
    type=“HTML”
    的元素作为转义元素,而规范明确指出它们是转义的?当您要求Python的
    feedparser
    库或PHP的
    Simplepie
    库从标题定义为:
    Example ptitle/p
    的提要返回
    标题时,它们都将返回
    ExampleTitle

    。这个问题围绕着CDATA元素是否应该绕过将数据解析为未跳过形式时所做的典型未跳过操作。@mmcdole-在该示例中,HTML只是使用实体而不是CDATA进行编码。所以是的,CDATA应该被视为CDATA。
    <h1>Johnson &amp;amp; Johnson</h1>