Різниця між PCDATA та CDATA у DTD


86

У чому різниця між #PCDATAта #CDATAв DTD ?


1
можливий дублікат того, що насправді є PCDATA та CDATA?
Джошуа Дрейк

Назви ключових слів, що використовуються в 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, оскільки це ключове слово вказує, що елемент повинен містити дані, що піддаються аналізу - тобто будь-який текст, крім символів менше ніж ( <), більші за ( >), амперсанд ( &), quote ( ') та подвійні лапки ( ").

У наступному прикладі <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.