2009-05-13 11 views
26

sembra che una definizione più generale delle PCDATA e CDATA è cheche cos'è effettivamente PCDATA e CDATA?

  1. PCDATA è dati di caratteri, ma è essere analizzato.
  2. CDATA è un dato carattere e non è da analizzare.

ma poi qualcuno mi ha detto che CDATA è effettivamente analizzato o PCDATA in realtà non viene analizzato ... quindi è un po 'di confusione. Qualcuno sa che il vero affare è?

Aggiornamento: In realtà ho aggiunto la definizione PCDATA su Wikipedia ... quindi non prendere troppo seriamente la risposta poiché è solo la mia comprensione grossolana.

+0

La confusione può essere causata dal fatto che CDATA può essere analizzato, ma da un parser diverso. Ad esempio, il contenuto di un elemento 'script', che è CDATA in HTML, viene analizzato dall'interprete Javascript. –

risposta

22

Da wiki:

PCDATA

Semplicemente parlando, PCDATA sta per Parsed caratteri dati. Ciò significa che i caratteri devono essere analizzati dal parser XML, XHTML o HTML. (&lt; verrà modificato in <, <p> verrà considerato un tag di paragrafo, ecc.). Confrontalo con CDATA, dove i caratteri non devono essere analizzati dal parser XML, XHTML o HTML.

CDATA

Il termine CDATA, che significa dati di carattere, viene utilizzato per distinti, ma correlati scopi nel linguaggi di markup SGML e XML. Il termine indica che una certa parte del documento è costituita da dati di carattere generali, piuttosto che dati non di carattere o dati di carattere con una struttura più specifica e limitata.

0

tua prima definizione è corretta.

PCDATA viene analizzato, il che significa che le entità sono espanse e che il testo viene considerato come markup. CDATA non viene analizzato da un parser XML.

9

Vengono analizzati sia PCDATA che CDATA. Sono entrambi i dati carattere.

Entrambi devono includere solo caratteri validi. Ad esempio se la codifica del documento è UTF-8, il contenuto delle sezioni CDATA deve essere ancora caratteri UTF-8 validi. Quindi i dati binari casuali probabilmente impediranno al documento di essere ben formato. Anche le sezioni CDATA vengono ancora analizzate, se non altro per trovare il tag della sezione finale. Ma altri caratteri simili a markup, come <,> e & vengono ignorati e passati così come sono dal parser.

OTOH in PCDATA litteral < e & (e 'o "nei valori di attributo) deve essere escapato, o verrà interpretato come markup. Anche le entità verranno espanse.

Quindi sì, le sezioni CDATA sono effettivamente analizzate. Non sono sicuro del motivo per cui ti è stato detto che PCDATA non è stato analizzato.

3
  • 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 sarà non analizzato da un parser. I tag all'interno del testo saranno non da trattare come markup e le entità non verranno espanse.

Per impostazione predefinita, tutto è PCDATA. Nel seguente esempio, ignorando la radice, verrà analizzato e non avrà alcun contenuto, ma un figlio.

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

Quando vogliamo specificare che un elemento conterrà solo il testo, e non elementi figlio, usiamo la parola chiave PCDATA, perché questa parola chiave specifica che l'elemento deve contenere i dati di carattere analizzabile - vale a dire, qualsiasi testo ad eccezione i caratteri minori di (<), maggiore di (>), e commerciale (&), preventivo (') e doppio preventivo (").

Nell'esempio seguente, la barra è CDATA e non viene analizzata , e ha il contenuto "contenuto!".

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

Esistono diversi modelli di contenuto in SGML. Il modello di contenuto #PCDATA afferma che un elemento può contenere testo normale. La parte "analizzata" significa che il markup (inclusi i PI, i commenti e le direttive SGML) in esso contenuto viene analizzato anziché visualizzato come testo non elaborato. Significa anche che i riferimenti di entità sono sostituiti.

Un altro tipo di modello di contenuto che consente il contenuto di testo semplice è CDATA. In XML, il modello di contenuto dell'elemento non può essere implicitamente impostato su CDATA, ma in SGML significa che i riferimenti di markup e entità vengono ignorati nei contenuti dell'elemento. Tuttavia, negli attributi del tipo CDATA, i riferimenti di entità vengono sostituiti.

In XML #PCDATA è l'unico modello di contenuto in testo normale. Lo si utilizza se si desidera consentire il contenuto del testo nell'elemento. Il modello di contenuto CDATA può essere utilizzato esplicitamente attraverso il markup del blocco CDATA in #PCDATA, ma il contenuto dell'elemento non può essere definito come CDATA per impostazione predefinita.

In un DTD, il tipo di attributo che contiene testo deve essere CDATA. La parola chiave CDATA in una dichiarazione di attributo ha un significato diverso rispetto alla sezione CDATA in un documento XML. Nella sezione CDATA tutti i caratteri sono legali (incluso <,>, &, "e" caratteri) eccetto "]]>" tag finale ".

#PCDATA non è appropriato per il tipo di un attributo. È usato per il tipo di testo "foglia".

#PCDATA è preceduto da un hashtag semplicemente per ragioni storiche.

0

Se solo gli elementi sono stati impostati su CDATA per impostazione predefinita nei DTD XHTML, si risparmiano molte brutte sostituzioni manuali ... Perché i blocchi di script contengono altri elementi? Se ci sono tali elementi, vengono gestiti dall'interprete JS nelle azioni di manipolazione DOM, nel qual caso dovrebbero essere completamente ignorati dal parser XML prima dell'inserimento e del rendering del documento. Suppongo che potrebbe essere stato progettato per forzare l'uso di file di risorse di script esterni, che in definitiva è una buona cosa.

Problemi correlati