2009-02-02 9 views

Antwort

-1

Sie können es als CDATA speichern, aber es besteht das Risiko, dass einige Bytefolgen gültige XML-Daten auswerten, die den CDATA-Abschnitt schließen. Nach einem kurzen Blick auf http://www.w3.org/TR/2006/REC-xml-20060816/#sec-cdata-sect, so scheint es Ihnen eine beliebige Folge von Zeichen mit Ausnahme von „]]>“ haben können. Sehen Sie sich auch what is a valid XML char an.

+1

Bedeutet das nicht, dass Sie nicht können, da 0-8, B, C, E, F FFFE und FFFF ungültige Zeichen sind? –

+0

Nach unten, da viele Bytefolgen nicht beibehalten werden. Mit "nicht beibehalten" meine ich, dass es nicht möglich ist, die ursprünglichen Binärdaten von CDATA-kodierten Daten wiederherzustellen. Siehe Pete's Antwort und Kommentare. – rwong

+0

es ist viel gefährlicher, als Sie hier vorschlagen. Siehe petes Antwort ... – Phil

11

Das Nul-Zeichen ('\ 0' in C) ist nirgendwo in XML gültig, auch nicht als Escape-Zeichen (& # 0;).

+0

Ich nehme an, da XML-Dateien nullterminierte sind. –

+2

@ Jeremy: Sie sind nicht. Null ist einfach kein gültiges XML-Zeichen, wahrscheinlich wegen nullterminierter Zeichenfolgen in einer populären Programmiersprache ... – Christoph

+0

Beachten Sie, dass der Standard darüber nicht 100% klar ist.Die Zeichenbereichsdefinitionen schließen das 0-Byte aus, aber einige andere Texte sagen, dass ein beliebiges Zeichen unter 127 gültig ist. –

4

XML ist ein Nur-Text-Format - verwenden Sie es nicht, um binäre Daten zu speichern. Setzen Sie die binären Blobs in separate Dateien und fügen Sie Ihrem XML ein Element hinzu, das auf diese Dateien verweist. Wenn Sie alle binären Blobs in einer einzigen Datei speichern möchten, fügen Sie ein Offset-Attribut oder etwas ähnliches hinzu.

+0

Ja, und genau wie soll Flash eine Verbindung herstellen und rohe binäre Off-Dateien lesen? (Nur ActionScript 2) –

+0

Geben Sie mir nicht das ByteArray- oder URLLoader-Gespräch. Dies ist nur AS2. –

+2

@ Jeremy: und wo genau hast du das in deiner Frage angegeben? – Christoph

7

Nein, Sie können CDATA nicht allein zum Einfügen von Binärdaten in eine XML-Datei verwenden.

In XML1.0 (weil XML 1.1 zügiger ist, aber nicht um Kontrolle Zeichen), die folgenden Einschränkungen gelten für CDATA Zeichen:

CData  ::=  (Char* - (Char* ']]>' Char*)) 
Char  ::=  #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] 

Das heißt, es gibt mehrere Zeichen illegal, unter ihnen sind:

  • illegal XML-Steuerzeichen 0x00 bis 0x20 außer neue Linien, Wagenrücklauf und Tabs
  • illegal UTF-8-Sequenzen wie 0xFF oder die nicht kanonisch 0b1100000x 0b10xxxxxx
  • 012.

Zusätzlich zu, dass in einem Standard Entitätsinhalt ohne CDATA:

  • "<" und ">" Verwendung sind illegal
  • "&" Verwendung eingeschränkt ist (&eacute; ist OK, &zajdalkdza; ist nicht)

So CDATA ist nur ein Weg, "<", ">" und "&", durch die Einschränkung "]]>" statt zu ermöglichen. Es löst nicht die illegalen XML-, Unicode- und UTF-8-Zeichen, die das Hauptproblem darstellen.

Lösungen:

  1. Verwenden Base64 mit 33% Overhead, aber eine großen Unterstützung in allen Programmiersprachen und die Tatsache, dass es ein Standard-
  2. Verwenden BaseXML mit noch begrenzt Implementierungen aber 20% Overhead ist nur
  3. Binärdaten nicht innerhalb von XML kodieren, wenn möglich, separat übertragen
Verwandte Themen