Использовать CDATA для хранения необработанных двоичных потоков? - PullRequest
6 голосов
/ 02 февраля 2009

Вместо издержек с сохранением двоичного файла в виде Base64 мне было интересно, могли бы вы напрямую хранить двухбайтовые двоичные потоки в файлах XML, используя CDATA, или комментировать его, или что-то еще?

Ответы [ 4 ]

11 голосов
/ 02 февраля 2009

Символ Nul ('\ 0' в C) недопустим в любом месте XML, даже в качестве escape (& # 0;).

9 голосов
/ 05 июля 2013

Нет, вы не можете использовать только CDATA для ввода двоичных данных в файл XML.

В XML1.0 (поскольку XML 1.1 является более разрешающим, но не для контрольных символов), к символам CDATA применяются следующие ограничения:

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

Это означает, что есть несколько недопустимых символов, среди которых:

  • недопустимые управляющие символы XML от 0x00 до 0x20, за исключением новых строк, возврата каретки и табуляции
  • недопустимые последовательности UTF-8, такие как 0xFF или неканонические 0b1100000x 0b10xxxxxx

В дополнение к этому, в стандартном объекте контента без CDATA:

  • "<" и ">" использование запрещено
  • «&» использование ограничено (&eacute; в порядке, &zajdalkdza; - нет)

Так что CDATA - это просто способ разрешить "<", ">" и "&", ограничивая вместо "]]>". Это не решает проблему нелегальных символов XML, Unicode и UTF-8, которая является основной проблемой.

Решения:

  1. Использование Base64 с накладными расходами 33%, но большой поддержкой во всех языках программирования и тем, что это стандарт
  2. Использование BaseXML с ограниченным числом реализаций, но только с 20% накладных расходов
  3. Не кодируйте двоичные данные в XML, если это возможно, передавайте их отдельно
4 голосов
/ 02 февраля 2009

XML - это текстовый формат - не используйте его для хранения двоичных данных. Поместите двоичные двоичные объекты в отдельные файлы и добавьте в свой XML элемент, который ссылается на эти файлы. Если вы хотите сохранить все двоичные двоичные объекты в одном файле, добавьте атрибут смещения или что-то в этом роде ...

0 голосов
/ 02 февраля 2009

Вы можете сохранить его как CDATA, но есть риск, что некоторые байтовые последовательности оценят допустимый XML, закрывающий раздел CDATA. После быстрого просмотра http://www.w3.org/TR/2006/REC-xml-20060816/#sec-cdata-sect, кажется, что вы можете иметь любую последовательность символов, кроме "]]>". Посмотрите на , что также является допустимым XML-символом .

...