Использовать DTD для определения элемента как CDATA? - PullRequest
3 голосов
/ 05 февраля 2012

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

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

<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 может быть где угодно между 30K до 100K данных.

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

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

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

1 Ответ

2 голосов
/ 05 февраля 2012

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

...