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


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

Я вызываю сторонний API, который создает некоторые недопустимые символы внутри элемента. В частности, данные содержат некоторые HTML-объекты, такие как ’. Когда я пытаюсь проанализировать этот XML с помощью SimpleXML, я, конечно, получаю ошибку синтаксического анализатора "Сущность 'rsquo' не определена". Вот упрощенный пример структуры того, с чем я имею дело:

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

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

Author: Jared Cobb, 2012-02-05

1 answers

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

 2
Author: Quentin, 2012-02-04 20:41:15