XML文档中的![CDATA []]节点有什么作用

本文概述

什么以及为什么使用它

CDATA代表字符数据。你可以使用它来转义一些字符, 否则这些字符将被视为常规XML。其中的数据将不会被解析。例如, 如果要传递包含<或>的数学方程式, 则可以使用CDATA来完成。否则, 你将得到一个错误, 因为它将被解析为常规XML并且将是无效的。

以下xml文档将被错误地解析, 因为比利时华夫饼的描述包含” 5 <6″:

<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
<food>
  <name>Belgian Waffles</name>
  <price>$5.95</price>
  <description>
    Our famous Belgian Waffles with plenty of real maple syrup. 5 < 6
  </description>
  <calories>650</calories>
</food>
<food>
  <name>French Toast</name>
  <price>$4.50</price>
  <description>Thick slices made from our homemade sourdough bread</description>
  <calories>600</calories>
</food>
</breakfast_menu>

如果你验证先前的xml文档, 你将得到:

XML无效的数据或标记

请注意, 你也可以解决此问题, 将这些字符编码为其html实体(例如, 使用php中的html_entities)。

<example-code>
    while (x &lt; len &amp;&amp; !done) {
        print( &quot;Hello.&quot; );
        ++x;
    }
</example-code>

但是, 这可能会变得棘手, 因为你需要注意何时对这些实体进行编码和解码, 因此建议改用CDATA。

如何使用它

可以在可能出现字符数据的任何地方添加CDATA节;它们用于转义包含字符的文本块, 否则这些字符将被视为标记。 CDATA节以字符串” <![CDATA [“]开头, 以字符串”]]>”结尾。

只需使用CDATA标签包装节点的内容即可:

<node><![CDATA[
  Hello, here its my <b>HTML content</b> parsed with html tags as data without issues. And yes, 5 < 6 :)
]]></node>

因此, 应该解决第一个示例文档问题, 将内容包装在cdata标记中:

<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
<food>
  <name>Belgian Waffles</name>
  <price>$5.95</price>
  <description><![CDATA[
    Our famous Belgian Waffles with plenty of real maple syrup. 5 < 6
  ]]></description>
  <calories>650</calories>
</food>
<food>
  <name>French Toast</name>
  <price>$4.50</price>
  <description>Thick slices made from our homemade sourdough bread</description>
  <calories>600</calories>
</food>
</breakfast_menu>

而不是将字符转换为html实体, 我们将改为使用:

<example-code><![CDATA[
while (x < len && !done) {
    print( "Hello." );
    ++x;
    }
]]></example-code>

派上用场不是吗?

最后的提示和结论

  • 在CDATA中, 内容中不能包含字符串]]>(CDEnd), 否则xml也将被错误地解析。
  • 从句法上讲, 它的行为类似于注释, 但cdata标记仍是文档的一部分。
  • CDATA节无法嵌套文档节点(即使是有效的xml节点, 它们也不会被解析, 因为这是该节点的内容)
微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?