Короче говоря, возможно ли использовать DTD для определения элемента как содержащего CDATA?
Я вызываю сторонний API, который создает недопустимые символы внутри элемента. В частности, данные содержат некоторые объекты HTML, такие как ’
. Когда я пытаюсь проанализировать этот XML с помощью SimpleXML, я, конечно, получаю ошибку синтаксического анализатора "Entity 'rsquo' notfined". Вот упрощенный пример структуры того, с чем я имею дело:
<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)>
]>
Спасибо за любые идеи!