Qual é a diferença entre #PCDATA
e #CDATA
em DTD ?
#PCDATA
e CDATA
. Não há PCDATA
palavra-chave e não #CDATA
.
Qual é a diferença entre #PCDATA
e #CDATA
em DTD ?
#PCDATA
e CDATA
. Não há PCDATA
palavra-chave e não #CDATA
.
Respostas:
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.
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 #PCDATA
modelo 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 CDATA
modelo de conteúdo pode ser usado explicitamente por meio da CDATA
marcação de bloco em #PCDATA
, mas o conteúdo do elemento não pode ser definido como CDATA
padrão.
Em um DTD, o tipo de atributo que contém texto deve ser CDATA
. A CDATA
palavra-chave em uma declaração de atributo tem um significado diferente da CDATA
seção em um documento XML. Em uma CDATA
seção de todos os caracteres são legais (incluindo <
, >
, &
, '
e "
caracteres), exceto a ]]>
marca de fim.
#PCDATA
nã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).
#
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').
#PCDATA
esteja 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)>
.
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>
.
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.
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.