Нет, вы не можете использовать только 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:
- "<" и ">" использование запрещено
- «&» использование ограничено (
é
в порядке, &zajdalkdza;
- нет)
Так что CDATA - это просто способ разрешить "<", ">" и "&", ограничивая вместо "]]>". Это не решает проблему нелегальных символов XML, Unicode и UTF-8, которая является основной проблемой.
Решения:
- Использование Base64 с накладными расходами 33%, но большой поддержкой во всех языках программирования и тем, что это стандарт
- Использование BaseXML с ограниченным числом реализаций, но только с 20% накладных расходов
- Не кодируйте двоичные данные в XML, если это возможно, передавайте их отдельно