2009-02-02 8 views

risposta

-1

È 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.

+1

Non significa no, non è possibile, poiché 0-8, B, C, E, F FFFE e FFFF sono caratteri non validi? –

+0

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

+0

è molto più rischioso di quanto suggerisci qui. Vedi la risposta di pete ... – Phil

11

Il carattere Nul ('\ 0' in C) non è valido da nessuna parte in XML, nemmeno come escape (& # 0;).

+0

Suppongo che i file XML abbiano una terminazione null. –

+2

@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

+0

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. –

4

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 ...

+0

Sì, e esattamente in che modo si suppone che Flash si connetta e legga i file binari non formattati? (Solo ActionScript 2) –

+0

Non fornirmi la conversazione ByteArray o URLLoader. Questo è solo AS2. –

+2

@Jeremy: e dove lo hai detto esattamente nella tua domanda? – Christoph

7

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 (&eacute; è 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:

  1. 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
  2. Usa BaseXML con le implementazioni ancora limitate ma il 20% in testa solo
  3. Non codificare i dati binari all'interno di XML, se possibile, trasferirlo separatamente
Problemi correlati