web-dev-qa-db-fra.com

Différence entre PCDATA et CDATA dans la DTD

Quelle est la différence entre #PCDATA et #CDATA dansDTD?

80
Jakub Arnold

PCDATA - Données de caractère analysées

Les analyseurs XML analysent normalement tout le texte d'un document XML.

CDATA - Données de caractère (non analysées)

Le terme CDATA est utilisé pour les données texte qui ne doivent pas être analysées par l'analyseur XML.

Des caractères tels que "<" et "&" sont interdits dans les éléments XML.

68
Matthew Vines
  • PCDATA est un texte qui sera analysé par un analyseur. Les balises à l'intérieur du texte Seront traitées comme du balisage et les entités seront développées. 
  • CDATA est un texte qui sera non sera analysé par un analyseur. Les balises à l'intérieur du texte seront pas seront traitées comme des balises et les entités ne seront pas développées.

Par défaut, tout est en PCDATA. Dans l'exemple suivant, en ignorant la racine, <bar> sera analysé et n'aura pas de contenu, mais un enfant. 

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

Lorsque nous voulons spécifier qu'un élément ne contiendra que du texte et aucun élément enfant, nous utilisons le mot-clé PCDATA, car ce mot-clé indique que l'élément doit contenir des données de caractère parsable - autrement dit, tout texte sauf les ), supérieur à (>), esperluette (&), guillemet (') et double guillemet (").

Dans l'exemple suivant, <bar> contient CDATA. Son contenu ne sera pas analysé et est donc <test>content!</test>.

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

Il existe plusieurs modèles de contenu dans SGML. Le modèle de contenu #PCDATA indique qu'un élément peut contenir du texte brut. La partie "analysée" indique que le balisage (y compris les PI, les commentaires et les directives SGML) est analysé au lieu d’être affiché sous forme de texte brut. Cela signifie également que les références d'entité sont remplacées.

CDATA est un autre type de modèle permettant le contenu en texte brut. En XML, le modèle de contenu d'élément ne peut pas implicitement être défini sur CDATA, mais en SGML, cela signifie que les références de balisage et d'entité sont ignorées dans le contenu de l'élément. Cependant, dans les attributs de type CDATA, les références d'entité sont remplacées.

En XML, #PCDATA est le seul modèle de contenu en texte brut. Vous l'utilisez si vous souhaitez autoriser le contenu du texte dans l'élément. Le modèle de contenu CDATA peut être utilisé explicitement via le balisage de bloc CDATA dans #PCDATA, mais le contenu de l'élément ne peut pas être défini en tant que CDATA par défaut.

Dans une DTD, le type d'un attribut contenant du texte doit être CDATA. Le mot clé CDATA dans une déclaration d'attribut a une signification différente de celle de la section CDATA dans un document XML. Dans une section CDATA, tous les caractères sont légaux (y compris les caractères <,>, &, ’et“), à l’exception de la balise de fin “]]>”.

#PCDATA n'est pas approprié pour le type d'un attribut. Il est utilisé pour le type de texte "feuille".

#PCDATA est précédé d'un hachage simplement pour des raisons historiques.

67
Rose Perrone

D'ici ( Google est votre ami ):

Dans une DTD, PCDATA et CDATA sont utilisés pour affirmer quelque chose sur le permis contenu des éléments et attributs, respectivement. Dans le contenu d'un élément modèle, #PCDATA dit que l'élément contient (peut contenir) "tout ancien texte." (Avec les exceptions indiquées ci-dessous.) In une déclaration d'attribut, CDATA est une sorte de contrainte que vous pouvez appliquer les valeurs admissibles de l'attribut (autres sortes, toutes mutuellement exclusives, comprennent ID, IDREF et NMTOKEN). Un attribut dont les valeurs admissibles sont CDATA peut (comme PCDATA dans un élément) contient "tout ancien texte".

Une question potentiellement très déroutante est-ce qu'il y a une autre "CDATA", également appelé sections marquées. UNE section marquée est une partie de l'élément (#PCDATA) contenu délimité par cordes spéciales: pour le fermer. Si vous Rappelez-vous que PCDATA est "analysé données de caractères", une section CDATA est littéralement la même chose, sans le "analysé." Les analyseurs transmettent le contenu d'une section marquée en aval applications sans hoquet tous les temps ils rencontrent des caractères spéciaux comme <et &. Ceci est utile quand vous codez un document qui contient beaucoup de ces caractères spéciaux (comme scripts et fragments de code); ses plus facile sur la saisie de données, et plus facile sur lecture, que l'entité correspondante référence.

Vous pouvez donc en déduire que l'exception à la règle "tout ancien texte" est celle PCDATA ne peut inclure aucun de ces éléments non échappés caractères spéciaux, sauf s'ils tombent dans le cadre d'un CDATA marqué section.

11
Oli

PCDATA - données de caractère analysées. Il analyse toutes les données d'un document XML. 

Exemple:

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

Ici, l’élément familial contient 2 autres éléments "Mère" et "père". Il faut donc analyser plus avant le texte de mère et père pour donner la valeur de famille en tant que «maman papa»

CDATA - Données caractées non analysées. Il s’agit des données que Ne devraient pas être analysées plus avant dans un document XML.

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

Ici, la valeur de famille sera <mother>mom</mother><father>dad</father>.

9
winter

La principale différence entre PCDATA et CDATA est que

PCDATA - Principalement utilisé pour ELEMENTS tandis que

CDATA - Utilisé pour les attributs de XML i.e ATTLIST 

3
Rachana K

CDATA (CharacterDATA): Il en va de même pour un commentaire, mais cela fait partie du document. CDATA est une donnée, c’est une partie du document mais les données ne peuvent pas être analysées en XML.
Remarque: Le commentaire XML est omis lors de l'analyse syntaxique d'un fichier XML, mais CDATA s'affiche tel quel.

PCDATA (ParsedCharacterDATA): Par défaut, tout est en PCDATA. PCDATA est une donnée, elle peut être analysée en XML.

0
Premraj