Différence entre PCDATA et CDATA dans DTD

86

Quelle est la différence entre #PCDATAet #CDATAdans DTD ?

Jakub Arnold
la source
1
duplication possible de ce que sont réellement PCDATA et CDATA?
Joshua Drake
Les noms des mots-clés utilisés dans les DTD XML sont #PCDATAet CDATA. Il n'y a pas de PCDATAmot-clé et non #CDATA.
mzjn
1
En plus de la réponse acceptée, vous devriez lire stackoverflow.com/a/918462/2013911 car elle explique la différence entre le type d'attribut CDATA et les sections marquées <! [CDATA []]>.
Niklas Peter

Réponses:

75

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

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

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

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

Les caractères tels que "<" et "&" sont illégaux dans les éléments XML.

Matthieu Vines
la source
77
  • PCDATAest du 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.
  • CDATAest du texte qui ne sera pas analysé par un analyseur. Les balises à l'intérieur du texte ne seront pas traitées comme du balisage et les entités ne seront pas développées.

Par défaut, tout est PCDATA. Dans l'exemple suivant, ignorant la racine, <bar>sera analysé, et il n'aura aucun 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é spécifie que l'élément doit contenir des données de caractères analysables - c'est-à-dire tout texte à l'exception des caractères inférieurs à ( <), supérieur à ( >), esperluette ( &), guillemet ( ') et guillemet double ( ").

Dans l'exemple suivant, <bar>contient CDATA. Son contenu ne sera pas analysé et l'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 #PCDATAmodèle de contenu indique qu'un élément peut contenir du texte brut. La partie "analysée" signifie que le balisage (y compris les PI, les commentaires et les directives SGML) qu'il contient 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.

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

En XML, #PCDATAest le seul modèle de contenu en texte brut. Vous l'utilisez si vous souhaitez autoriser le contenu de texte dans l'élément. Le CDATAmodèle de contenu peut être utilisé explicitement via le CDATAbalisage de bloc dans #PCDATA, mais le contenu de l'élément peut ne pas être défini CDATApar défaut.

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

#PCDATAne convient pas au type d'attribut. Il est utilisé pour le type de texte "feuille".

#PCDATAest précédé d'un hachage dans le modèle de contenu pour distinguer ce mot-clé d'un élément nommé PCDATA(ce qui serait parfaitement légal).

Rose Perrone
la source
6
Excellente réponse, sauf pour la dernière phrase. #n'est pas un hashtag. Seule une balise précédée de ce symbole est un hashtag. Le symbole lui-même a de nombreux noms , y compris «signe dièse», «signe dièse» (principalement au Canada et aux États-Unis), ou simplement «hachage» (d'où le nom «hashtag»).
6
#justhadtogetthatoffmychest
3
Je ne suis pas d'accord pour dire que le # devant #PCDATAest là pour des raisons historiques. Il est là parce que dans une DTD, un élément peut également contenir un élément nommé PCDATA, qui doit être possible, et qui ressemblerait à <!ELEMENT foo (PCDATA)>.
Mathias Müller
La citation et la double citation sont parfaitement légales dans le contenu PCDATA. Et une esperluette peut apparaître, mais (en XML) uniquement en tant qu'introducteur d'entité.
Toby Speight
12

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

Exemple:

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

Ici, l' <family>élément contient 2 éléments supplémentaires: <mother>et <father>. Donc, il analyse plus avant pour obtenir le texte de la mère et du père pour donner la valeur textuelle de la famille en tant que «maman papa»

CDATA - Données de caractère non analysées. Ce sont les données qui ne doivent pas être analysées plus avant dans un document xml.

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

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

empreintes
la source
11

De là ( Google est votre ami ):

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

Un problème potentiellement très déroutant est qu'il existe un autre «CDATA», également appelé sections marquées. Une section marquée est une partie du contenu de l'élément (#PCDATA) délimitée par des chaînes spéciales: pour la fermer. Si vous vous souvenez que PCDATA est «des données de caractères analysées», une section CDATA est littéralement la même chose, sans le «analysé». Les analyseurs transmettent le contenu d'une section marquée aux applications en aval sans hoquet à chaque fois qu'ils rencontrent des caractères spéciaux comme <et &. Ceci est utile lorsque vous codez un document qui contient beaucoup de ces caractères spéciaux (comme des scripts et des fragments de code); c'est plus facile pour la saisie des données et plus facile pour la lecture que la référence d'entité correspondante.

Vous pouvez donc en déduire que l'exception à la règle «tout ancien texte» est que PCDATA ne peut inclure aucun de ces caractères spéciaux non échappés, À MOINS qu'ils ne tombent dans le cadre d'une section marquée CDATA.

Oli
la source
3

La principale différence entre PCDATA et CDATA est

PCDATA - Principalement utilisé pour les ELEMENTS

CDATA - Utilisé pour les attributs de XML ie ATTLIST

Rachana K
la source
0

CDATA ( C haracter DATA ): C'est similaire à un commentaire mais cela fait partie du document. c'est-à-dire que CDATA est une donnée, elle fait 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 d'un XML, mais CDATA s'affiche tel quel.

PCDATA ( P arsed C haracter DATA ): Par défaut, tout est PCDATA. PCDATA est une donnée, elle peut être analysée en XML.

Premraj
la source