Использовать DTD для определения элемента как CDATA?


Короче говоря, можно ли использовать DTD для определения элемента как содержащего CDATA?

Я вызываю сторонний API, который производит некоторые недопустимые символы внутри элемента. В частности, данные содержат некоторые HTML-объекты, такие как ’. Когда я пытаюсь разобрать этот XML с помощью SimpleXML, я, конечно, получаю ошибку синтаксического анализатора "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 может содержать от 30 до 100 тысяч данных.

Я бы предпочел использовать DTD, но за всю свою жизнь я не могу найти никаких спецификаций, которые позволяют определить CDATA (точно так же, как я могу определить PCDATA ). Вот что я хотел бы сделать :, но, конечно, это недопустимо из-за определения "#CDATA", которое я пытаюсь сделать:

<!DOCTYPE ITEMS [
    <!ELEMENT ITEMS (ITEM)>
    <!ELEMENT ITEM (NAME, DESCRIPTION)>
    <!ELEMENT NAME (#PCDATA)>
    <!ELEMENT DESCRIPTION (#CDATA)>
]>

Спасибо за любые идеи!

1 3

1 ответ:

Это возможно в SGML DTDs (например, HTML 4.01 script element), но не в XML DTDs (отсюда изменение для XHTML 1.0).