Что на самом деле PCDATA и CDATA?

Кажется, что свободное определение PCDATA и CDATA заключается в том, что

  1. PCDATA - это символьные данные, но их нужно проанализировать.
  2. CDATA - это символьные данные, которые не анализируются.

но потом кто-то сказал мне, что CDATA фактически анализируется или PCDATA фактически не анализируется... так что это немного путаница. Кто-нибудь знает реальная сделка?

Обновление: я фактически добавил определение PCDATA в Википедии... так что не принимайте этот ответ слишком серьезно, так как это только мое грубое понимание.

6 ответов

Решение

Из Вики:

PCDATA

Проще говоря, PCDATA расшифровывается как Parsed Character Data. Это означает, что символы должны быть проанализированы синтаксическим анализатором XML, XHTML или HTML. (&lt; будет изменен на <, <p> будет означать тег абзаца и т. д.). Сравните это с CDATA, где символы не должны анализироваться анализатором XML, XHTML или HTML.

CDATA

Термин CDATA, означающий символьные данные, используется для различных, но связанных целей в языках разметки SGML и XML. Термин указывает, что определенная часть документа является общими символьными данными, а не не символьными данными или символьными данными с более конкретной, ограниченной структурой.

И PCDATA, и CDATA анализируются. Они оба символьные данные.

Они оба должны содержать только действительные символы. Например, если кодировка вашего документа - UTF-8, содержимое разделов CDATA должно по-прежнему быть действительными символами UTF-8. Таким образом, случайные двоичные данные, вероятно, помешают правильному оформлению документа. Кроме того, разделы CDATA все еще анализируются, хотя бы для того, чтобы найти тег конца раздела. Но другие подобные разметке символы, такие как <,> и & игнорируются и передаются синтаксическим анализатором как есть.

OTOH в PCDATA litteral <и & (и 'или "в значениях атрибутов) необходимо экранировать, иначе они будут интерпретироваться как разметка. Объекты также будут расширены.

Так что да, разделы CDATA действительно анализируются. Я не уверен, почему вам сказали, что PCDATA не анализируется, хотя.

PCDATA - проанализированные символьные данные

CDATA - (неразобранные) символьные данные

http://www.w3schools.com/XML/xml_cdata.asp

  • PCDATA - это текст, который будет проанализирован парсером. Теги внутри текста будут обрабатываться как разметка, а объекты будут расширяться.
  • CDATA - это текст, который не будет анализироваться парсером. Теги внутри текстане будут рассматриваться как разметка, а объекты не будут расширяться.

По умолчанию все PCDATA. В следующем примере, игнорируя корень, будет проанализирован, и у него не будет никакого контента, кроме одного дочернего.

<?xml version="1.0"?>
<foo>
<bar><test>content!</test></bar>
</foo>

Когда мы хотим указать, что элемент будет содержать только текст, а не дочерние элементы, мы используем ключевое слово PCDATA, потому что это ключевое слово указывает, что элемент должен содержать анализируемые символьные данные, то есть любой текст, кроме символов меньше чем (<), больше (>), амперсанд (&), кавычка (') и двойная кавычка (").

В следующем примере bar - это CDATA, он не анализируется и содержит контент "content!".

<?xml version="1.0"?>
<foo>
<bar><![CDATA[<test>content!</test>]]></bar>
</foo>

В SGML есть несколько моделей контента. Модель содержимого #PCDATA говорит, что элемент может содержать простой текст. "Разобранная" часть означает, что разметка (включая PI, комментарии и директивы SGML) в ней анализируется, а не отображается как необработанный текст. Это также означает, что ссылки на сущности заменяются.

Другим типом контентной модели, допускающей текстовое содержимое, является CDATA. В XML модель содержимого элемента не может быть неявно установлена ​​на CDATA, но в SGML это означает, что разметка и ссылки на сущности игнорируются в содержимом элемента. Однако в атрибутах типа CDATA ссылки на сущности заменяются.

В XML #PCDATA - единственная модель содержимого с открытым текстом. Вы используете его, если вы вообще хотите разрешить текстовое содержимое в элементе. Модель содержимого CDATA может использоваться явно через разметку блока CDATA в #PCDATA, но содержимое элемента может не определяться как CDATA по умолчанию.

В DTD тип атрибута, который содержит текст, должен быть CDATA. Ключевое слово CDATA в объявлении атрибута имеет другое значение, чем раздел CDATA в документе XML. В разделе CDATA все символы являются допустимыми (включая символы <,>,&, 'и "), кроме конечного тега"]]> ".

#PCDATA не подходит для типа атрибута. Используется для типа "листового" текста.

#PCDATA предваряется хешем (также известным как "хэштег" или octothorp) просто по историческим причинам.

Ваше первое определение верно.

PCDATA анализируется, что означает, что объекты раскрываются, и этот текст обрабатывается как разметка. CDATA не анализируется анализатором XML.

Если бы в XDTML DTD по умолчанию были заданы только элементы CDATA, это сохраняло бы много уродливых ручных переопределений... Почему блоки скриптов содержат другие элементы? Если такие элементы есть, они обрабатываются интерпретатором JS в действиях по манипулированию DOM - в этом случае они все равно должны полностью игнорироваться синтаксическим анализатором XML перед вставкой и отображением документа. Я предполагаю, что он, возможно, был разработан для принудительного использования внешних файлов ресурсов скриптов, что в конечном итоге хорошо.

Другие вопросы по тегам