简而言之,是否可以使用DTD将元素定义为包含CDATA?
我正在调用第三方API,它会在元素中产生一些无效字符。具体来说,数据包含一些HTML实体,如’
。当我尝试使用SimpleXML解析这个XML时,我当然得到一个解析器错误“Entity'rsquo'未定义”。这是我正在处理的简单示例结构:
<items>
<item>
<name>Jim Smith</name>
<description>Jim’s description breaks my parser</description>
</item>
</items>
由于我没有控制权来修复API响应......在我尝试解析它之前,我已经使用这个肮脏的技巧在问题元素中注入一个CDATA部分:
$xml = str_replace("<description>", "<description><![CDATA[", $xml);
$xml = str_replace("</description>", "]]></description>", $xml);
这解决了我的问题,但开销可能太大了,你不觉得吗? XML可以是30K到100K之间的任何数据。
我宁愿使用DTD,但就我而言,我找不到任何允许定义 CDATA 的规范(就像我可以定义 PCDATA )。以下是我喜欢的内容,但当然,由于我正在尝试的'#CDATA'定义,它无效:
<!DOCTYPE ITEMS [
<!ELEMENT ITEMS (ITEM)>
<!ELEMENT ITEM (NAME, DESCRIPTION)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT DESCRIPTION (#CDATA)>
]>
感谢您的任何见解!
答案 0 :(得分:2)
可以在SGML DTD中使用(例如the HTML 4.01 script element),但不能在XML DTD中使用(因此the change for XHTML 1.0)。