3
總之,是否可以使用DTD將元素定義爲包含CDATA?使用DTD將元素定義爲CDATA?
我打電話給一個第三方API,在元素中產生一些無效字符。具體來說,數據包含一些HTML實體,如’
。當我試圖用SimpleXML解析這個XML時,我當然會得到一個解析器錯誤「Entity'rsquo'not defined」。下面是我處理的簡單的例子結構:
<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)>
]>
感謝您的見解!
有趣。所以這基本上意味着我應該尋找一個SGML解析器(使用PHP)而不是使用SimpleXML?在da的最後,我需要將XML轉換爲可用的對象或數組。我不熟悉SGML。謝謝! – 2012-02-04 20:51:55
由於該文檔是XML,因此您應該向向您提供數據的第三方報告該錯誤,並在同一時間繼續進行修復。 – Quentin 2012-02-04 20:54:57
哎呀。看起來我只是在破解它,直到他們可以修復它。感謝您的確認! – 2012-02-04 21:01:21