Разница между PCDATA и CDATA в DTD


86

В чем разница между #PCDATAи #CDATAв DTD ?



Имена ключевых слов, используемых в XML DTD: #PCDATAи CDATA. Ключевого PCDATAслова нет и нет #CDATA.
mzjn

1
В дополнение к принятому ответу вы должны прочитать stackoverflow.com/a/918462/2013911, потому что он объясняет разницу между типом атрибута CDATA и разделами, отмеченными <! [CDATA []]>.
Никлас Питер

Ответы:


75

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

Анализаторы XML обычно анализируют весь текст в документе XML.

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

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

Такие символы, как «<» и «&» недопустимы в элементах XML.


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

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

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

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

В следующем примере <bar>содержит CDATA. Его содержимое не будет проанализировано и, таким образом, выполняется <test>content!</test>.

<?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добавляется хешем в модели содержимого, чтобы отличить это ключевое слово от указанного элемента PCDATA(что было бы совершенно законно).


6
Отличный ответ, за исключением последнего предложения. #это не хэштег. Только тег, которому предшествует этот символ, является хэштегом. У самого символа есть много названий , включая «знак числа», «знак фунта» (в основном, Канада и США) или просто «хэш» (отсюда и название «хэштег»).

6
#justhadtogetthatoffmychest

3
Я не согласен с тем, что символ # перед #PCDATAзнаком стоит по историческим причинам. Это происходит потому, что в DTD элемент может также содержать элемент с именем PCDATA, который должен быть возможен и который будет выглядеть так <!ELEMENT foo (PCDATA)>.
Матиас Мюллер

Цитаты и двойные кавычки совершенно допустимы в содержимом PCDATA. И амперсанд может появиться, но (в XML) только как средство представления сущности.
Тоби Спейт

12

PCDATA - проанализированные символьные данные. Он анализирует все данные в XML-документе.

Пример:

<family>
    <mother>mom</mother>
    <father>dad</father>
</family>

Здесь <family>элемент содержит еще 2 элемента: <mother>и <father>. Таким образом, он выполняет дальнейший синтаксический анализ, чтобы получить текст матери и отца, чтобы дать текстовое значение семьи как «мама, папа».

CDATA - неанализируемые символьные данные. Это данные, которые не следует анализировать в xml-документе.

<family>
    <![CDATA[ 
       <mother>mom</mother>
       <father>dad</father>
    ]]>
</family>

Здесь будет текстовое значение семейства <mother>mom</mother><father>dad</father>.


11

Отсюда ( Google - ваш друг ):

В DTD PCDATA и CDATA используются, чтобы утверждать что-то о допустимом содержании элементов и атрибутов соответственно. В модели содержимого элемента #PCDATA говорит, что элемент содержит (может содержать) «любой старый текст». (За исключениями, как указано ниже.) В объявлении атрибута CDATA - это один из видов ограничений, которые вы можете наложить на допустимые значения атрибута (другие виды, все взаимоисключающие, включая ID, IDREF и NMTOKEN). Атрибут, допустимые значения которого равны CDATA, может (например, PCDATA в элементе) содержать «любой старый текст».

Потенциально действительно сбивающая с толку проблема заключается в том, что есть еще один «CDATA», также называемый отмеченными разделами. Отмеченный раздел - это часть содержимого элемента (#PCDATA), разделенная специальными строками: закрыть. Если вы помните, что PCDATA - это «проанализированные символьные данные», раздел CDATA - это буквально то же самое, без «проанализированных». Синтаксические анализаторы передают содержимое помеченного раздела нижестоящим приложениям без сбоев каждый раз, когда они сталкиваются со специальными символами, такими как <и &. Это полезно, когда вы кодируете документ, содержащий множество этих специальных символов (например, скрипты и фрагменты кода); это легче вводить данные и легче читать, чем соответствующая ссылка на сущность.

Таким образом, вы можете сделать вывод, что исключением из правила «любой старый текст» является то, что PCDATA не может включать ни один из этих неэкранированных специальных символов, ЕСЛИ они не попадают в область помеченного раздела CDATA.


3

Самая главная разница между PCDATA и CDATA заключается в

PCDATA - в основном используется для ЭЛЕМЕНТОВ, в то время как

CDATA - используется для атрибутов XML, например ATTLIST


0

CDATA ( C haracter DATA ): похож на комментарий, но является частью документа. т.е. CDATA - это данные, это часть документа, но данные не могут быть проанализированы в XML.
Примечание: комментарий XML пропускается при разборе XML, но CDATA отображается как есть.

PCDATA ( P arsed C haracter DATA ): По умолчанию, все PCDATA. PCDATA - это данные, их можно разобрать в XML.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.