Differenza tra PCDATA e CDATA in DTD


86

Qual è la differenza tra #PCDATAe #CDATAin DTD ?



I nomi delle parole chiave utilizzate nei DTD XML sono #PCDATAe CDATA. Non ci sono PCDATAparole chiave e no #CDATA.
mzjn

1
Oltre alla risposta accettata, dovresti leggere stackoverflow.com/a/918462/2013911 perché spiega la differenza tra il tipo di attributo CDATA e le sezioni contrassegnate con <! [CDATA []]>.
Niklas Peter

Risposte:


75

PCDATA - Dati carattere analizzati

I parser XML normalmente analizzano tutto il testo in un documento XML.

CDATA - Dati carattere (non analizzati)

Il termine CDATA viene utilizzato per i dati di testo che non devono essere analizzati dal parser XML.

Caratteri come "<" e "&" sono illegali negli elementi XML.


77
  • PCDATAè un testo che verrà analizzato da un parser. I tag all'interno del testo verranno trattati come markup e le entità verranno espanse.
  • CDATAè un testo che non verrà analizzato da un parser. I tag all'interno del testo non verranno trattati come markup e le entità non verranno espanse.

Per impostazione predefinita, tutto è PCDATA. Nell'esempio seguente, ignorando la radice, <bar>verrà analizzato e non avrà contenuto, ma un figlio.

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

Quando vogliamo specificare che un elemento conterrà solo testo e nessun elemento figlio, utilizziamo la parola chiave PCDATA, poiché questa parola chiave specifica che l'elemento deve contenere dati carattere analizzabili, ovvero qualsiasi testo eccetto i caratteri minori di ( <), maggiore di ( >), e commerciale ( &), virgolette ( ') e virgolette doppie ( ").

Nel prossimo esempio, <bar>contiene CDATA. Il suo contenuto non verrà analizzato ed è così <test>content!</test>.

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

Esistono diversi modelli di contenuto in SGML. Il #PCDATAmodello di contenuto afferma che un elemento può contenere testo normale. La parte "analizzata" significa che il markup (inclusi PI, commenti e direttive SGML) viene analizzato invece che visualizzato come testo grezzo. Significa anche che i riferimenti all'entità vengono sostituiti.

Un altro tipo di modello di contenuto che consente contenuti di testo normale è CDATA. In XML, il modello di contenuto dell'elemento potrebbe non essere impostato implicitamente CDATA, ma in SGML significa che i riferimenti a markup e entità vengono ignorati nel contenuto dell'elemento. Negli attributi di CDATAtipo, tuttavia, i riferimenti alle entità vengono sostituiti.

In XML, #PCDATAè l'unico modello di contenuto in testo normale. Lo usi se vuoi consentire il contenuto del testo nell'elemento. Il CDATAmodello di contenuto può essere utilizzato esplicitamente attraverso il CDATAmarkup del blocco in #PCDATA, ma il contenuto dell'elemento potrebbe non essere definito come CDATApredefinito.

In una DTD, il tipo di un attributo che contiene testo deve essere CDATA. La CDATAparola chiave in una dichiarazione di attributo ha un significato diverso rispetto alla CDATAsezione in un documento XML. In una CDATAsezione di tutti i personaggi sono legali (tra cui <, >, &, 'e "caratteri), ad eccezione del ]]>tag di chiusura.

#PCDATAnon è appropriato per il tipo di attributo. Viene utilizzato per il tipo di testo "foglia".

#PCDATAè anteposto da un hash nel modello di contenuto per distinguere questa parola chiave da un elemento denominato PCDATA(che sarebbe perfettamente legale).


6
Ottima risposta, tranne l'ultima frase. #non è un hashtag. Solo un tag preceduto da questo simbolo è un hashtag. Il simbolo stesso ha molti nomi , tra cui "simbolo del numero", "cancelletto" (principalmente Canada e Stati Uniti) o semplicemente "hash" (da cui il nome "hashtag").

6
#justhadtogetthatoffmychest

3
Non sono d'accordo che il # davanti #PCDATAsia lì per ragioni storiche. È lì perché in un DTD, un elemento potrebbe contenere anche un elemento denominato PCDATA, che deve essere possibile e che sarebbe simile <!ELEMENT foo (PCDATA)>.
Mathias Müller

Le virgolette e le virgolette doppie sono perfettamente legali nel contenuto PCDATA. E la e commerciale può apparire, ma (in XML) solo come introduttore di entità.
Toby Speight

12

PCDATA - dati dei caratteri analizzati. Analizza tutti i dati in un documento XML.

Esempio:

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

Qui, l' <family>elemento contiene altri 2 elementi: <mother>e <father>. Quindi analizza ulteriormente per ottenere il testo di madre e padre per dare al testo valore della famiglia come "mamma papà"

CDATA - Dati carattere non analizzati. Questi sono i dati che non dovrebbero essere analizzati ulteriormente in un documento xml.

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

Qui, il valore testuale della famiglia sarà <mother>mom</mother><father>dad</father>.


11

Da qui ( Google è tuo amico ):

In un DTD, PCDATA e CDATA vengono utilizzati per affermare qualcosa sul contenuto consentito di elementi e attributi, rispettivamente. Nel modello di contenuto di un elemento, #PCDATA dice che l'elemento contiene (può contenere) "qualsiasi vecchio testo". (Con le eccezioni riportate di seguito). Nella dichiarazione di un attributo, CDATA è un tipo di vincolo che è possibile applicare ai valori consentiti dell'attributo (altri tipi, tutti mutuamente esclusivi, includono ID, IDREF e NMTOKEN). Un attributo i cui valori consentiti sono CDATA può (come PCDATA in un elemento) contenere "qualsiasi vecchio testo".

Un problema potenzialmente molto confuso è la presenza di un altro "CDATA", denominato anche sezioni contrassegnate. Una sezione contrassegnata è una porzione di contenuto dell'elemento (#PCDATA) delimitata da stringhe speciali: per chiuderla. Se ricordi che PCDATA è "dati di caratteri analizzati", una sezione CDATA è letteralmente la stessa cosa, senza "parsed". I parser trasmettono il contenuto di una sezione contrassegnata alle applicazioni a valle senza singhiozzi ogni volta che incontrano caratteri speciali come <e &. Ciò è utile quando si codifica un documento che contiene molti di quei caratteri speciali (come script e frammenti di codice); è più facile nell'immissione dei dati e più facile nella lettura rispetto al riferimento all'entità corrispondente.

Quindi puoi dedurre che l'eccezione alla regola "qualsiasi vecchio testo" è che PCDATA non può includere nessuno di questi caratteri speciali senza caratteri di escape, A MENO che non rientrino nell'ambito di una sezione contrassegnata da CDATA.


3

La differenza principale tra PCDATA e CDATA è

PCDATA - Fondamentalmente utilizzato per ELEMENTS while

CDATA - Utilizzato per gli attributi di XML, ovvero ATTLIST


0

CDATA ( C haracter DATA ): è simile a un commento ma fa parte del documento. cioè CDATA è un dato, fa parte del documento ma i dati non possono essere analizzati in XML.
Nota: il commento XML viene omesso durante l'analisi di un XML ma CDATA viene visualizzato così com'è.

PCDATA ( P arsed C haracter DATA ): per impostazione predefinita, tutto è PCDATA. PCDATA è un dato, può essere analizzato in XML.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.