Diferença entre PCDATA e CDATA em DTD


86

Qual é a diferença entre #PCDATAe #CDATAem DTD ?



Os nomes das palavras-chave usadas em XML DTDs são #PCDATAe CDATA. Não há PCDATApalavra-chave e não #CDATA.
mzjn

1
Além da resposta aceita, você deve ler stackoverflow.com/a/918462/2013911 porque explica a diferença entre o tipo de atributo CDATA e as seções marcadas <! [CDATA []]>.
Niklas Peter,

Respostas:


75

PCDATA - Dados de caracteres analisados

Os analisadores XML normalmente analisam todo o texto em um documento XML.

CDATA - Dados de caracteres (não analisados)

O termo CDATA é usado para dados de texto que não devem ser analisados ​​pelo analisador XML.

Caracteres como "<" e "&" são ilegais em elementos XML.


77
  • PCDATAé o texto que será analisado por um analisador. As tags dentro do texto serão tratadas como marcação e as entidades serão expandidas.
  • CDATAé um texto que não será analisado por um analisador. As tags dentro do texto não serão tratadas como marcação e as entidades não serão expandidas.

Por padrão, tudo é PCDATA. No exemplo a seguir, ignorando a raiz, <bar>será analisado e não terá conteúdo, mas um filho.

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

Quando queremos especificar que um elemento conterá apenas texto, e nenhum elemento filho, usamos a palavra-chave PCDATA, porque essa palavra-chave especifica que o elemento deve conter dados de caracteres analisáveis ​​- ou seja, qualquer texto, exceto os caracteres menores que ( <), maior que ( >), e comercial ( &), aspas ( ') e aspas duplas (" ).

No próximo exemplo, <bar>contém CDATA. Seu conteúdo não será analisado e é assim <test>content!</test>.

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

Existem vários modelos de conteúdo em SGML. O #PCDATAmodelo de conteúdo diz que um elemento pode conter texto simples. A parte "analisada" significa que a marcação (incluindo PIs, comentários e diretivas SGML) é analisada em vez de exibida como texto bruto. Isso também significa que as referências da entidade são substituídas.

Outro tipo de modelo de conteúdo que permite conteúdo de texto simples é CDATA. Em XML, o modelo de conteúdo do elemento não pode ser implicitamente definido como CDATA, mas em SGML, isso significa que as referências de marcação e entidade são ignoradas no conteúdo do elemento. Em atributos deCDATA tipo, no entanto, as referências de entidade são substituídas.

Em XML, #PCDATAé o único modelo de conteúdo de texto simples. Use-o se quiser permitir conteúdo de texto no elemento. O CDATAmodelo de conteúdo pode ser usado explicitamente por meio da CDATAmarcação de bloco em #PCDATA, mas o conteúdo do elemento não pode ser definido como CDATApadrão.

Em um DTD, o tipo de atributo que contém texto deve ser CDATA. A CDATApalavra-chave em uma declaração de atributo tem um significado diferente da CDATAseção em um documento XML. Em uma CDATAseção de todos os caracteres são legais (incluindo <, >, &, 'e "caracteres), exceto a ]]>marca de fim.

#PCDATAnão é apropriado para o tipo de atributo. É usado para o tipo de texto "folha".

#PCDATAé prefixado por um hash no modelo de conteúdo para distinguir essa palavra-chave de um elemento denominado PCDATA(o que seria perfeitamente legal).


6
Ótima resposta, exceto pela última frase. #não é uma hashtag. Apenas uma tag precedida por este símbolo é uma hashtag. O símbolo em si tem muitos nomes , incluindo "sinal de número", "sinal de libra" (principalmente Canadá e EUA) ou apenas "hash" (daí o nome 'hashtag').

6
#justhadtogetthatoffmychest

3
Não concordo que o # na frente de #PCDATAesteja lá por razões históricas. Ele está lá porque em um DTD, um elemento também pode conter um elemento denominado PCDATA, que deve ser possível e que seria semelhante a <!ELEMENT foo (PCDATA)>.
Mathias Müller

Citação e aspas duplas são perfeitamente legais no conteúdo PCDATA. E o e comercial pode aparecer, mas (em XML) apenas como um introdutor de entidade.
Toby Speight

12

PCDATA - dados de caracteres analisados. Ele analisa todos os dados em um documento XML.

Exemplo:

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

Aqui, o <family>elemento contém mais 2 elementos: <mother>e <father>. Portanto, ele analisa ainda mais para obter o texto da mãe e do pai para dar ao texto o valor da família como "mãe e pai"

CDATA - Dados de caracteres não analisados. Esses são os dados que não devem ser analisados ​​posteriormente em um documento xml.

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

Aqui, o valor do texto da família será <mother>mom</mother><father>dad</father>.


11

A partir daqui (o Google é seu amigo ):

Em um DTD, PCDATA e CDATA são usados ​​para afirmar algo sobre o conteúdo permitido de elementos e atributos, respectivamente. No modelo de conteúdo de um elemento, #PCDATA diz que o elemento contém (pode conter) "qualquer texto antigo". (Com exceções, conforme observado abaixo.) Na declaração de um atributo, CDATA é um tipo de restrição que você pode colocar nos valores permitidos do atributo (outros tipos, todos mutuamente exclusivos, incluem ID, IDREF e NMTOKEN). Um atributo cujos valores permitidos são CDATA pode (como PCDATA em um elemento) conter "qualquer texto antigo".

Um problema potencialmente muito confuso é que há outro "CDATA", também conhecido como seções marcadas. Uma seção marcada é uma parte do conteúdo do elemento (#PCDATA) delimitada por strings especiais: para fechá-la. Se você se lembrar que PCDATA são "dados de caracteres analisados", uma seção CDATA é literalmente a mesma coisa, sem os "dados analisados". Analisadores transmitem o conteúdo de uma seção marcada para aplicativos downstream sem soluçar toda vez que encontram caracteres especiais como <e &. Isso é útil quando você está codificando um documento que contém muitos desses caracteres especiais (como scripts e fragmentos de código); é mais fácil na entrada de dados e mais fácil na leitura do que a referência de entidade correspondente.

Portanto, você pode inferir que a exceção à regra de "qualquer texto antigo" é que PCDATA não pode incluir nenhum desses caracteres especiais sem escape, A MENOS que eles se enquadrem no escopo de uma seção marcada com CDATA.


3

A principal diferença entre PCDATA e CDATA é

PCDATA - Basicamente usado para ELEMENTS enquanto

CDATA - usado para atributos de XML, ou seja, ATTLIST


0

CDATA ( C haracter DATA ): É semelhante a um comentário, mas faz parte do documento. ou seja, CDATA é um dado, faz parte do documento, mas os dados não podem ser analisados ​​em XML.
Nota: O comentário XML é omitido durante a análise de um XML, mas CDATA é mostrado como está.

PCDATA ( P arsed C haracter DATA ): Por padrão, tudo é PCDATA. PCDATA é um dado, pode ser analisado em XML.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.