代码之家  ›  专栏  ›  技术社区  ›  Tomalak

CDATA存在的原因是什么?

  •  11
  • Tomalak  · 技术社区  · 15 年前

    我经常看到人们在这里提出与XML/XSLT相关的问题,这些问题的根源在于无法理解CDATA的工作方式(如 this one )

    我想知道-为什么它首先存在?这并不是说没有它,XML就不能做,可以放入CDATA部分的所有内容都可以表示为“本机”(XML转义)。

    我很欣赏CDATA可能会使结果文档更小一些,但让我们面对现实——XML无论如何都是冗长的。例如,通过压缩可以更容易地实现小型XML文档。

    对于我来说,CDATA打破了标记和数据之间的清晰分离,因为您可以拥有肉眼看起来像标记的数据,我发现这是一件坏事。(这甚至可能是鼓励人们对XML不适当地应用字符串处理或regex的原因之一。)

    那么:使用CDATA有什么好的理由呢?

    8 回复  |  直到 11 年前
        1
  •  11
  •   cHao Hammerite    11 年前

    CDATA 章节只是为了方便人类作者,而不是为了程序。它们的唯一用途是让人类能够轻松地在XHTML页面中包含SVG示例代码,而无需仔细地替换 < 具有 &lt; 等等。

    这是我的预期用途。不要将结果文档缩小几个字节,因为您可以使用 < 而不是 &书信电报; .

    同样,从上面的示例(xhtml中的svg代码)中获取样本,这使得我可以很容易地检查xhtml文件的源代码,只需复制、粘贴svg代码就可以了,无需再次进行替换。 &书信电报; 具有 < .

        2
  •  5
  •   Community Tales Farias    11 年前

    pcdata—解析的字符数据,这意味着输入的数据将由解析器解析。

    CDATA-解析器不会解析在CDATA元素之间输入的数据。也就是说,解析器将忽略CDATA部分中的文本。因此,恶意用户可以使用这些CDATA元素向应用程序发送破坏数据。

    CDATA部分以开头 <![CDATA[ 结束于 ]]> .

    唯一一条 不能 发生在CDATA中的是 ] .

    我们使用CDATA的唯一原因是:像javascript代码这样的文本包含很多 < ,&个字符。为了避免错误,可以将脚本代码定义为CDATA,因为使用 < 仅当解析器将其解释为新元素的开始时,就会生成一个错误。同样地 & 分析器可以将其解释为字符实体的开头。

        3
  •  3
  •   sinibar    15 年前

    我相信CDATA是 打算 要允许原始二进制数据:只要它不包含“]]>”,那么任何内容都将进入CDATA部分。这确实使它与普通的XML不同,并且应该加快解析速度(并且消除了全文编码的必要性,从而提高了第二个性能)。 事实上,它被证明是一个很有问题的问题:人们没有逃过结束序列,几个早期的解析器有不同的损坏,所以大多数现在只使用文本编码来对二进制数据进行编码,使得CDATA部分有点毫无意义,是的。

    编辑: 注意这个答案实际上是错误的,正如Tomalak在评论中所指出的那样。我没有删除它,因为我知道还有其他人认为原始二进制在CDATA中是可以接受的,这可能会消除这个小小的误解。

        4
  •  3
  •   sernaferna    15 年前

    我不知道这会有多大帮助,但我也会把它扔进去:

    其中一个问题是,XML开发人员有两个截然不同的阵营,其中一些人将XML视为 数据 还有一些人更喜欢 以文档为中心 方式。(XML的好处是它对两者都很好。)

    那些将XML视为数据表示的人——XML通常由工具生成和使用,而人们只参与故障排除——在CDATA部分中几乎看不到任何价值,因为它不会对他们的工具产生影响,而那些将XML用于更以文档为中心的目的的人可能会发现CDATA部分更多。很有用。

        5
  •  3
  •   Peter Lindqvist    15 年前

    对我来说,CDATA只是懒惰的另一个词。当我开始使用XML时,我使用它,但现在我总是转换数据。

    我能想到的最好原因是方便。尤其是当您使用XML作为某种形式的包装器,将数据从一个系统传输到另一个系统时,在这种情况下,您可能会得到以下结果。

    创建XML包装
    将数据转换为XML
    将数据放入包装器中
    将XML发送到接收器
    将XML拆分为XML+XML中的数据
    将XML中的数据转换为数据

    而使用CDATA将导致不需要额外的转换步骤。

    另一种用法是嵌入数据,而不必关心嵌入数据中的不同命名空间。但这并不是一个很好的使用方法。

    我发现了另一个使用CDATA的好方法的例子,这是我应该想到的。当您需要将代码嵌入到XML文件中时,这种情况下代码不应该被转换,或者它将无法工作和/或不容易读取。

        6
  •  2
  •   Ryan Lynch    15 年前

    MXML演示了如何大量使用CDATA标记。我喜欢MXML的一个特点是它是有效的XML,这意味着我可以做一些有用的事情,比如使用转换从不同的XML文件以编程方式生成Flash小部件,并根据模式验证MXML。

    CDATA标记在MXML中很有用,因为它们可以在MXML文件中定义ActionScript脚本块,允许我在单个文件中组合ECMA类型的脚本语言(与>和<等)和有效的XML。

    编辑:

    我认为将MXML和ActionScript结合起来的另一种选择是以HTML和JavaScript结合的方式将它们结合起来,即将脚本包装在脚本块内的XML注释标记中,而使用CDATA的选择是由MXML编译器的开发人员做出的。我认为原因可能更多地与编辑有关,因为MXML编辑器根据模式验证代码,以检查语法并提供上下文帮助,以及分析ActionScript代码以获取语法和上下文帮助。在编辑器中使用CDATA可以同时执行这两项操作,并区分XML注释和脚本块。

        7
  •  2
  •   NickFitz    15 年前

    如果有疑问, check the spec :

    2.7 CDATA部分

    [定义:CDATA节可以出现在任何可能出现字符数据的地方;它们用于转义包含字符的文本块,否则这些字符将被识别为标记。

        8
  •  1
  •   colethecoder    15 年前

    当您想要为某个XML定义一个模式,但是其中的一部分超出了您的控制,并且您不能确保它符合该模式或者不会破坏XML时,CDATA部分确实很有用。

    我经常需要使用具有HTML输出的传统系统,这些输出通常不是格式良好的XHTML,我可以附加一个模式,以确保XML的结构正确,但带有一个标记,该标记只包含一个CDATA部分,用于在CDATA中容纳可能不好的HTML。

    这不是一个常见的用法,但当你不想让其他人的松散编程破坏你的系统时,它肯定有它的用途。