Use CDATA para armazenar fluxos binários?
Pergunta
Em vez da sobrecarga com binário salvar como Base64 , eu queria saber se você poderia armazenar diretamente double-byte streams binários em arquivos XML, usando CDATA, ou comentando-o para fora, ou algo assim?
Solução
Você pode armazená-lo como CDATA, mas há o risco de que algumas seqüências de bytes irá avaliar como XML válido que fecha a seção CDATA. Depois de um rápido olhar para http: // www. w3.org/TR/2006/REC-xml-20060816/#sec-cdata-sect , parece que você pode ter qualquer seqüência de caracteres, exceto "]]>". Ter um olhar para o que é um XML válido caractere também.
Outras dicas
O personagem Nul ( '\ 0' no C) não é em qualquer lugar válida em XML, mesmo como uma fuga (& # 0;).
Não, você não pode usar CDATA sozinho para injetar dados binários em um arquivo XML.
Em XML1.0 (porque XML 1.1 é mais permissiva, mas não sobre caracteres de controle), as seguintes restrições aplicam-se a personagens CDATA:
CData ::= (Char* - (Char* ']]>' Char*))
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Isso significa que existem vários caracteres ilegais, entre eles estão:
- caracteres de controlo XML ilegais 0x00 a 0x20 excepto novas linhas, símbolos de retorno e as abas
- UTF-8 sequências ilegais como 0xFF ou a não canónica 0b1100000x 0b10xxxxxx
Além disso, em um teor de entidade padrão sem CDATA:
- "<" e ">" utilização são ilegais
- "&" uso é restrito (
é
é OK,&zajdalkdza;
não é)
Assim CDATA é apenas uma maneira de permitir que "<", ">" e "&", restringindo "]]>" em vez. Não resolve o XML ilegal, Unicode e emissão caracteres UTF-8 que é o principal problema.
Soluções:
XML é um formato de texto simples - não usá-lo para armazenar dados binários. Coloque os blobs binários em arquivos separados e adicionar um elemento a seu XML que faz referência a esses arquivos. Se você deseja armazenar todos os blobs binários em um único arquivo, adicionar um atributo offset ou algo assim ...