使用DTD将元素定义为CDATA?

时间:2012-02-04 20:35:55

标签: php xml simplexml dtd cdata

简而言之,是否可以使用DTD将元素定义为包含CDATA?

我正在调用第三方API,它会在元素中产生一些无效字符。具体来说,数据包含一些HTML实体,如’。当我尝试使用SimpleXML解析这个XML时,我当然得到一个解析器错误“Entity'rsquo'未定义”。这是我正在处理的简单示例结构:

<items>
    <item>
        <name>Jim Smith</name>
        <description>Jim&rsquo;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)>
]>

感谢您的任何见解!

1 个答案:

答案 0 :(得分:2)

可以在SGML DTD中使用(例如the HTML 4.01 script element),但不能在XML DTD中使用(因此the change for XHTML 1.0)。