Использовать DTD для определения элемента как CDATA?
Короче говоря, можно ли использовать DTD для определения элемента как содержащего CDATA?
Я вызываю сторонний API, который создает некоторые недопустимые символы внутри элемента. В частности, данные содержат некоторые HTML-объекты, такие как ’
. Когда я пытаюсь проанализировать этот XML с помощью SimpleXML, я, конечно, получаю ошибку синтаксического анализатора "Сущность '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 может содержать от 30 до 100 тысяч данных.
Я бы предпочел использовать DTD, но, клянусь жизнью, я не могу найти никаких спецификаций, позволяющих определять CDATA (точно так же, как я могу определить PCDATA). Ниже приведено то, что я хотел бы сделайте, но, конечно, это недопустимо из-за определения "#CDATA", которое я пытаюсь сделать:
<!DOCTYPE ITEMS [
<!ELEMENT ITEMS (ITEM)>
<!ELEMENT ITEM (NAME, DESCRIPTION)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT DESCRIPTION (#CDATA)>
]>
Спасибо за любые идеи!
1 answers
Это возможно в SGML DTD (например, элемент сценария HTML 4.01 ), но не в XML DTD (отсюда изменение для XHTML 1.0).