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

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


person Jakub Arnold    schedule 27.05.2009    source источник
comment
возможный дубликат что такое PCDATA и CDATA?   -  person Joshua Drake    schedule 26.06.2015
comment
Имена ключевых слов, используемых в XML DTD, — #PCDATA и CDATA. Нет ключевого слова PCDATA и #CDATA.   -  person mzjn    schedule 29.12.2016
comment
В дополнение к принятому ответу вы должны прочитать stackoverflow.com/a/918462/2013911, поскольку он объясняет разницу между атрибутом CDATA введите и пометьте разделы ‹![CDATA[]]›.   -  person Niklas Peter    schedule 09.10.2017


Ответы (6)


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

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

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

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

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

person Matthew Vines    schedule 27.05.2009

  • 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 (что было бы совершенно законно).

person Rose Perrone    schedule 24.07.2012
comment
Отличный ответ, кроме последнего предложения. # не является хэштегом. Только тег, которому предшествует этот символ, является хэштегом. Сам символ имеет много названий, включая числовой знак, знак фунта (в основном Канада и США). ), или просто хеш (отсюда и название «хэштег»). - person ; 19.09.2013
comment
#просто надо было вытащить это из моей груди - person ; 19.09.2013
comment
Я не согласен с тем, что # перед #PCDATA стоит по историческим причинам. Это связано с тем, что в DTD элемент может также содержать элемент с именем PCDATA, что должно быть возможно, и который будет выглядеть как <!ELEMENT foo (PCDATA)>. - person Mathias Müller; 23.02.2016
comment
Цитаты и двойные кавычки вполне допустимы в содержимом PCDATA. И амперсанд может появиться, но (в XML) только как интродьюсер сущности. - person Toby Speight; 28.11.2019

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>.

person fingerprints    schedule 26.12.2016

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

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

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

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

person Oli    schedule 27.05.2009

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

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

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

person Rachana K    schedule 02.04.2013

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

PCDATA (Parsed Cсимвол DATA): по умолчанию все является PCDATA. PCDATA — это данные, их можно разобрать в XML.

person Premraj    schedule 12.07.2017