Invece del sovraccarico con saving binary as Base64, mi chiedevo se fosse possibile archiviare direttamente flussi binari a doppio byte in file XML, utilizzando CDATA o commentando o qualcosa del genere?Utilizzare CDATA per memorizzare flussi binari non elaborati?
risposta
È possibile memorizzarlo come CDATA, ma esiste il rischio che alcune sequenze di byte vengano valutate in XML valido che chiude la sezione CDATA. Dopo una rapida occhiata a http://www.w3.org/TR/2006/REC-xml-20060816/#sec-cdata-sect, sembra che tu possa avere qualsiasi sequenza di caratteri eccetto "]]>". Dai un'occhiata anche allo what is a valid XML char.
Il carattere Nul ('\ 0' in C) non è valido da nessuna parte in XML, nemmeno come escape (& # 0;).
Suppongo che i file XML abbiano una terminazione null. –
@Jeremy: Non lo sono. Null non è un carattere XML valido, probabilmente a causa di stringhe con terminazione null in un linguaggio di programmazione popolare ... – Christoph
Nota che lo standard non è del tutto chiaro al 100%.Le definizioni dell'intervallo di caratteri escludono il byte 0 ma alcuni altri testi dicono che qualsiasi carattere sotto 127 è valido. –
XML è un formato di testo semplice: non utilizzarlo per memorizzare dati binari. Inserisci i blob binari in file separati e aggiungi un elemento al tuo XML che fa riferimento a questi file. Se si desidera archiviare tutti i blob binari in un singolo file, aggiungere un attributo offset o qualcosa del genere ...
Sì, e esattamente in che modo si suppone che Flash si connetta e legga i file binari non formattati? (Solo ActionScript 2) –
Non fornirmi la conversazione ByteArray o URLLoader. Questo è solo AS2. –
@Jeremy: e dove lo hai detto esattamente nella tua domanda? – Christoph
No, non è possibile utilizzare CDATA da solo per iniettare dati binari in un file XML.
In XML1.0 (perché XML 1.1 è più permissiva, ma non si tratta di caratteri di controllo), le seguenti restrizioni si applicano a personaggi CDATA:
CData ::= (Char* - (Char* ']]>' Char*))
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Ciò significa che ci sono diversi personaggi illegali, tra i quali sono:
- caratteri di controllo XML illegali 0x00 a 0x20 eccezione nuove linee, i ritorni a capo e tabulazioni
- illegali UTF-8 sequenze come 0xFF o la non canonica 0b1100000x 0b10xxxxxx 012.
In aggiunta a ciò, in un contenuto un'entità standard senza CDATA:
- "<" e ">" l'uso sono illegali
- "&" uso è limitato (
é
è OK,&zajdalkdza;
è non)
Così CDATA è solo un modo per consentire "<", ">" e "&", limitando "]]>" invece. Non risolve il problema dei caratteri XML, Unicode e UTF-8 illegali, che è il problema principale.
Solutions:
- Utilizzare Base64 con il 33% in testa, ma un grande supporto in tutte le lingue di programmazione e il fatto che si tratta di uno standard
- Usa BaseXML con le implementazioni ancora limitate ma il 20% in testa solo
- Non codificare i dati binari all'interno di XML, se possibile, trasferirlo separatamente
Non significa no, non è possibile, poiché 0-8, B, C, E, F FFFE e FFFF sono caratteri non validi? –
Downvoting perché ci sono molte sequenze di byte che non verranno conservate. Con "non preservare", intendo che non è possibile recuperare i dati binari originali dai dati codificati con CDATA. Vedi la risposta e i commenti di Pete. – rwong
è molto più rischioso di quanto suggerisci qui. Vedi la risposta di pete ... – Phil