如何解决XML中PCDATA处理内的CDATA
如果我们具有以下XML元素:
<x>a < b</x>
和另一个
<y>a<![CDATA[ < ]]>b</y>
两个元素x
和y
的值都为a < b
吗?第二个示例是否有效,通用,推荐或类似的内容?
AFAK y
具有三个子元素-PCDATA a
,CDATA <
和PCDATA b
,并且某些库完全像这样解析它。另一方面,https://pugixml.org/仅返回a
作为x
(帮助函数)的值。
解决方法
两者之间存在根本区别:
CDATA 表示字符数据,而 PCDATA 表示已解析字符数据,这已经为我们提供了一个提示解析器可能会表现不同的正确方向,具体取决于它们的一致性级别。
CDATA节是<![CDATA[
和]]>
标记之间的所有内容的严格且纯粹的转义。在此之间编写的所有内容都不应该由XML处理器进行解析!符合标准的XML解析器只会忽略此处的任何内容,并将其不可见地传递给请求XML的任何应用程序(然后可以自由处理XML)。这就是为什么我们可以在此处放置任何通配符数据而不会使XML无效的原因。
<
是实体,更具体地说是字符实体。实体是“占位符”或“标记”,它们被内容替换。这意味着一个实体也是 PCDATA (已解析字符DATA)。它由XML解析器解析,然后解析它(尝试解析它的内容),以便它可以用它代替实体。
从数据的值开始,我们可能需要了解更多有关请求XML的应用程序的信息。在XML处理工具(XSD,XSLT,XPath,XQuery等)的域内,在两种情况下,它都应以text()
,xs:string()
或{{ 1}},具体取决于您用来访问它的功能。例如:
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()
中。
对于任何不能与XML数据模型一起使用的应用程序,结果应该只是文本,位于元素标签之间。
有一些interesting note here和整个主题相关的主题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。