1

If we have the following XML element:

<x>a &lt; b</x>

and the another one

<y>a<![CDATA[ < ]]>b</y>

Do both elements x and y have the value of a < b? Is the second example valid, common, recommended or something like that?

AFAK y has three child elements - PCDATA a, CDATA < and PCDATA b and some libraries parse it exactly like that. On the other hand https://pugixml.org/ for one returns only a as value for x (helper function).

4

1 回答 1

1

两者有一个根本区别:

CDATA表示Character Data,而PCDATA表示Parsed Character Data,这已经为我们提供了正确方向的提示,为什么解析器的行为可能会有所不同,具体取决于它们的一致性级别。

CDATA 部分是对and标记之间任何内容的严格而纯粹的转义。写在这之间的任何内容都不应该被XML 处理器解析!符合标准的 XML 解析器只是忽略此处的任何内容,并将其传递给任何请求 XML 的应用程序(然后它可以自行处理),而这些应用程序不可见。这就是为什么我们可以在这里放置任何通配符数据,而不会使 XML 失效。<![CDATA[]]>

&lt;是一个实体,更具体地说是一个字符实体。实体是被内容替换的“占位符”或“标记”。这意味着,实体也是PCDATA(已解析字符数据)。它由 XML 解析器解析,然后解释它(尝试解析其内容),以便它可以用它替换实体。

至于数据的价值,我们可能需要更多地了解请求 XML 的应用程序。在 XML 处理工具(XSD、XSLT、XPath、XQuery 等)的领域内,在这两种情况下,它都应该作为 或 的任何 XPath 数据类型出现,text()具体取决于您用来访问它的函数. 例如:xs:string()xs:untypedAtomic

let $t := <xml>Text <![CDATA[test]]> bla.</xml>
return $t/data() instance of xs:untypedAtomic
let $t := <xml>Text <![CDATA[test]]> bla.</xml>
return $t/string() instance of xs:string
let $t := <xml>Text <![CDATA[test]]> bla.</xml>
return $t/text() instance of text()

全部导致true

然而,对于任何不使用 XML 数据模型的应用程序,结果应该只是文本,它位于元素标记之间。

这里有一些有趣的注释和一个关于这个和相关主题的完整线程。

于 2020-10-31T06:28:20.300 回答