【问题标题】:Any standards related to adjacent CDATA?与相邻 CDATA 相关的任何标准?
【发布时间】:2016-06-18 15:29:53
【问题描述】:

我们知道 CDATA 不能嵌套,所以我喜欢使用 Using CDATA inside another CDATA 中提供的解决方案,将 ]]> 替换为 ]]]]><![CDATA[>

因此

<Root>
    <![CDATA[ 
        <AAA>
            <![CDATA[ 
                <BBB>hello world</BBB>
            ]]>
        </AAA>
    ]]>
</Root>

变成

<Root>
    <![CDATA[ 
        <AAA>
            <![CDATA[ 
                <BBB>hello world</BBB>
            ]]]]><![CDATA[>
        </AAA>
    ]]>
</Root>

XML 是我的 API 的响应,它将被不受我控制的其他程序使用。

对于 .NET,我的实验表明 InnerText 可以在所有 CDATA 部分中输出文本。

var Root= doc.SelectNode("/Root");
var cdata = Root.InnerText;

cdata 是

<AAA>
    <![CDATA[ 
        <BBB>hello world</BBB>
    ]]>
</AAA>

.NET 的行为是否符合任何标准?是否有任何标准说明如何处理相邻的 CDATA?如果我的 API 返回相邻的 CDATA,其他程序或编程语言是否会处理它?

【问题讨论】:

    标签: xml cdata


    【解决方案1】:

    这种行为完全符合标准,并且应该在任何 XML 处理器中产生相同的结果。 CDATA 部分可用于在任何地方转义任何字符数据(在另一个 CDATA 部分中除外),并且您可以使用任意数量的它们,无论是否相邻。来自specification

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

    【讨论】:

    • 我找不到 InnerText 的定义,可能规范使用了另一个我不知道的词。什么是元素的 InnerText,它是所有 CDATA 部分中的文本吗?相邻的 CDATA 部分是否被视为一个?
    • InnerText 是给定元素内的字符数据 (w3.org/TR/REC-xml/#dt-chardata) 的 .NET 等效项。此字符数据的每个部分和任何部分都可以使用 CDATA 进行转义。当您调用 InnerText 时,哪个 :NET 将取消转义。在最大的极端情况下,您可以将每个字符放在其自己的 CDATA 部分中。在另一个(通常)极端情况下,您不使用任何 CDATA 转义。 CDATA 部分是否相邻无关紧要。 CDATA 部分中的文本不会被进一步解释(这是 CDATA 转义的重点,以保护文本免受 XML 解释)
    • 此外,dom.spec.whatwg.org/#interface-text 表示text .wholeText 返回所有直接文本节点兄弟的组合数据
    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2017-03-08
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多