У чому різниця між #PCDATA
та #CDATA
в DTD ?
#PCDATA
та CDATA
. Немає PCDATA
ключового слова і немає #CDATA
.
У чому різниця між #PCDATA
та #CDATA
в DTD ?
#PCDATA
та CDATA
. Немає PCDATA
ключового слова і немає #CDATA
.
Відповіді:
PCDATA - проаналізовані символьні дані
Зазвичай аналізатори XML аналізують весь текст у документі XML.
CDATA - (Без аналізу) Дані символів
Термін CDATA використовується щодо текстових даних, які не повинні бути проаналізовані аналізатором XML.
Символи на кшталт "<" та "&" заборонені в елементах XML.
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
(що було б цілком законно).
#
не є хештегом. Тільки тег, якому передує цей символ, є хештегом. Сам символ має безліч назв , включаючи "цифровий знак", "знак фунта" (переважно Канада та США) або просто "хеш" (звідси і назва "хештег").
#PCDATA
є з історичних причин. Це відбувається тому, що в DTD елемент також може містити елемент з іменем PCDATA
, який повинен бути можливим і який би виглядав так <!ELEMENT foo (PCDATA)>
.
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>
.
Звідси ( Google - ваш друг ):
У DTD PCDATA та CDATA використовуються, щоб стверджувати щось про допустимий вміст елементів та атрибутів, відповідно. У моделі вмісту елемента #PCDATA говорить, що елемент містить (може містити) "будь-який старий текст". (За винятком, як зазначено нижче.) У декларації атрибута CDATA є одним із обмежень, яке ви можете покласти на допустимі значення атрибута (інші сорти, всі взаємовиключні, включають ID, IDREF та NMTOKEN). Атрибут, допустимими значеннями якого є CDATA, може (як PCDATA в елементі) містити "будь-який старий текст".
Потенційно дійсно заплутаною проблемою є те, що існує ще один "CDATA", який також називають позначеними розділами. Позначений розділ - це частина вмісту елемента (#PCDATA), розділена спеціальними рядками: щоб закрити його. Якщо ви пам'ятаєте, що PCDATA - це "аналізовані символьні дані", розділ CDATA - це буквально те саме, без "синтаксичного аналізу". Синтаксичні аналізатори передають вміст позначеного розділу подальшим програмам, не збиваючи кожен раз, коли вони зустрічають спеціальні символи, такі як <і &. Це корисно, коли ви кодуєте документ, який містить безліч цих спеціальних символів (наприклад, сценарії та фрагменти коду); це легше при введенні даних і легше при читанні, ніж відповідне посилання на сутність.
Отже, ви можете зробити висновок, що винятком із правила "будь-якого старого тексту" є те, що PCDATA не може включати жоден із цих спеціальних символів, що не виходять за рамки, Тільки якщо вони не потрапляють у сферу дії розділу, позначеного CDATA.
CDATA ( C haracter DATA ): Це схоже на коментар, але це частина документа. тобто CDATA - це дані, це частина документа, але дані неможливо проаналізувати у форматі XML.
Примітка: XML-коментар опускає під час розбору XML, але CDATA відображається таким, яким він є.
PCDATA ( P arsed C haracter DATA ): За замовчуванням, всі PCDATA. PCDATA - це дані, їх можна проаналізувати в XML.