本文概述
什么以及为什么使用它
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文档, 你将得到:
请注意, 你也可以解决此问题, 将这些字符编码为其html实体(例如, 使用php中的html_entities)。
<example-code>
while (x < len && !done) {
print( "Hello." );
++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节点, 它们也不会被解析, 因为这是该节点的内容)