Existe uma maneira de escaping de um token de final CDATA em xml?

Eu queria saber se existe alguma maneira de escaping de um token de fim de CDATA ( ]]> ) dentro de uma seção CDATA em um documento xml. Ou, mais geralmente, se houver alguma seqüência de escape para usar dentro de um CDATA (mas, se existir, acho que provavelmente faria sentido apenas escaping de tokens de início ou fim, de qualquer forma).

Basicamente, você pode ter um token inicial ou final embutido em um CDATA e dizer ao interpretador para não interpretá-lo, mas para tratá-lo apenas como outra sequência de caracteres.

Provavelmente, você deve refatorar sua estrutura xml ou seu código se você estiver tentando fazer isso, mas mesmo assim eu tenho trabalhado com xml diariamente nos últimos 3 anos e nunca tive esse problema, Eu queria saber se era possível. Apenas por curiosidade.

Editar:

Além de usar codificação html …

Claramente, esta questão é puramente acadêmica. Felizmente, tem uma resposta bem definida.

Você não pode escaping de uma sequência final CDATA. A regra de produção 20 da especificação XML é bem clara:

 [20] CData ::= (Char* - (Char* ']]>' Char*)) 

EDIT: Esta regra de produto significa literalmente “uma seção CData pode conter qualquer coisa que você quer, mas a seqüência ‘]]>’. Nenhuma exceção”.

EDIT2: A mesma seção também lê:

Dentro de uma seção CDATA, somente a seqüência CDEnd é reconhecida como marcação, para que os colchetes de ângulo esquerdo e “e” comercial possam ocorrer em sua forma literal; eles não precisam (e não podem) ser escapados usando ” < ” e ” & “. As seções CDATA não podem ser aninhadas.

Em outras palavras, não é possível usar referência de entidade, marcação ou qualquer outra forma de syntax interpretada. O único texto analisado dentro de uma seção CDATA é ]]> , e termina a seção.

Portanto, não é possível escaping ]]> dentro de uma seção CDATA.

EDIT3: A mesma seção também lê:

2.7 Seções CDATA

[Definição: seções CDATA podem ocorrer em qualquer lugar onde dados de caracteres possam ocorrer; eles são usados ​​para escaping de blocos de texto contendo caracteres que seriam reconhecidos como marcação. As seções CDATA começam com a string “< ! [CDATA [" e terminam com a string "]]>“:]

Em seguida, pode haver uma seção CDATA em qualquer lugar que dados de caractere possam ocorrer, incluindo várias seções CDATA adjacentes no local de uma única seção CDATA. Isso permite que seja possível dividir o token ]]> e colocar as duas partes dele em seções CDATA adjacentes.

ex:

 < ![CDATA[Certain tokens like ]]> can be difficult and ]]> 

deve ser escrito como

 < ![CDATA[Certain tokens like ]]]]>< ![CDATA[> can be difficult and ]]> 

Você tem que quebrar seus dados em pedaços para esconder o ]]> .

Aqui está a coisa toda:

< ![CDATA[]]]]>< ![CDATA[>]]>

O primeiro < ![CDATA[]]]]> tem o ]] . O segundo < ![CDATA[>]]> tem o > .

Você não escapa do ]]> mas você escaneia o > after ]] inserindo ]]>< ![CDATA[ antes do > , pense nisso como uma string \ em C / Java / PHP / Perl, mas apenas necessária antes a > e depois de um ]] .

BTW,

A resposta de S.Lott é a mesma, apenas redigida de forma diferente.

A resposta de S. Lott está certa: você não codifica a tag final, você a divide em várias seções CDATA.

Como lidar com esse problema no mundo real: usando um editor de XML para criar um documento XML que será inserido em um sistema de gerenciamento de conteúdo, tente escrever um artigo sobre as seções do CDATA. Seu truque comum de incorporar amostras de código em uma seção CDATA falhará aqui. Você pode imaginar como eu aprendi isso.

Mas na maioria das circunstâncias, você não encontrará isso, e aqui está o porquê: se você quiser armazenar (digamos) o texto de um documento XML como o conteúdo de um elemento XML, você provavelmente usará um método DOM, por exemplo:

 XmlElement elm = doc.CreateElement("foo"); elm.InnerText = "< [CDATA[[Is this a problem?]]>"; 

E o DOM escapa razoavelmente do , o que significa que você não inseriu inadvertidamente uma seção CDATA em seu documento.

Ah, e isso é interessante:

 XmlDocument doc = new XmlDocument(); XmlElement elm = doc.CreateElement("doc"); doc.AppendChild(elm); string data = "< ![[CDATA[This is an embedded CDATA section]]>"; XmlCDataSection cdata = doc.CreateCDataSection(data); elm.AppendChild(cdata); 

Esta é provavelmente uma ideosyncrasy do .NET DOM, mas isso não gera uma exceção. A exceção é lançada aqui:

 Console.Write(doc.OuterXml); 

Eu acho que o que está acontecendo sob o capô é que o XmlDocument está usando um XmlWriter produzir sua saída, e o XmlWriter verifica a boa formação à medida que escreve.

basta replace ]]> por ]]]]>< ![CDATA[>

Aqui está outro caso em que ]]> precisa ser escapado. Suponha que precisamos salvar um documento HTML perfeitamente válido dentro de um bloco CDATA de um documento XML e a fonte HTML tenha seu próprio bloco CDATA. Por exemplo:

 < ![CDATA[ ... html ...