2012-02-04 173 views
3

總之,是否可以使用DTD將元素定義爲包含CDATA?使用DTD將元素定義爲CDATA?

我打電話給一個第三方API,在元素中產生一些無效字符。具體來說,數據包含一些HTML實體,如’。當我試圖用SimpleXML解析這個XML時,我當然會得到一個解析器錯誤「Entity'rsquo'not defined」。下面是我處理的簡單的例子結構:

<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)> 
]> 

感謝您的見解!

回答

2

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

+0

有趣。所以這基本上意味着我應該尋找一個SGML解析器(使用PHP)而不是使用SimpleXML?在da的最後,我需要將XML轉換爲可用的對象或數組。我不熟悉SGML。謝謝! – 2012-02-04 20:51:55

+2

由於該文檔是XML,因此您應該向向您提供數據的第三方報告該錯誤,並在同一時間繼續進行修復。 – Quentin 2012-02-04 20:54:57

+0

哎呀。看起來我只是在破解它,直到他們可以修復它。感謝您的確認! – 2012-02-04 21:01:21