У меня есть два приложения, написанные на Java, которые взаимодействуют друг с другом с помощью сообщений XML по сети. Я использую синтаксический анализатор SAX на принимающей стороне, чтобы вернуть данные из сообщений. Одно из требований - встраивать двоичные данные в сообщение XML, но SAX это не нравится. Кто-нибудь знает как это сделать?
ОБНОВЛЕНИЕ: я получил это, работая с классом Base64 из библиотеки кодеков apache commons , на случай, если кто-то еще пытается что-то подобное.
источник
Base64 - действительно правильный ответ, а вот CDATA - нет, по сути говоря: «это может быть что угодно», но это не должно быть просто что-то, это должны быть двоичные данные в кодировке Base64. Схема XML определяет двоичный код Base 64 как примитивный тип данных, который вы можете использовать в своем xsd.
источник
xs:base64Binary
типа данных, который является правильным типом для использования.У меня была эта проблема только на прошлой неделе. Мне пришлось сериализовать PDF-файл и отправить его внутри XML-файла на сервер.
Если вы используете .NET, вы можете преобразовать двоичный файл непосредственно в строку base64 и вставить его в элемент XML.
Или есть метод, встроенный прямо в объект XmlWriter. В моем конкретном случае мне пришлось включить пространство имен типа данных Microsoft:
Строка abc выглядит примерно так:
источник
Я обычно кодирую двоичные данные с помощью MIME Base64 или кодировки URL .
источник
Попробуйте кодировать / декодировать ваши двоичные данные Base64. Также загляните в разделы CDATA
источник
Может быть, закодировать их в известный набор - популярный выбор - что-то вроде base 64.
источник
Любая двоичная кодировка текста подойдет. Я использую что-то подобное
источник
Накладные расходы Base64 составляют 33%.
BaseXML для XML1.0 накладных расходов составляет всего 20% . Но это не стандарт и пока есть только реализация C. Проверьте это, если вас беспокоит размер данных. Обратите внимание, что браузеры, как правило, реализуют сжатие, поэтому в нем меньше необходимости.
Я разработал его после обсуждения в этой теме: Кодирование двоичных данных в XML: альтернативы base64 .
источник
Хотя другие ответы в основном подходят, вы можете попробовать другой, более экономичный метод кодирования, например yEnc. ( Ссылка на yEnc wikipedia ) С yEnc также можно получить контрольную сумму прямо "из коробки". Читайте и ссылки ниже. Конечно, поскольку XML не имеет собственного типа yEnc, ваша XML-схема должна быть обновлена, чтобы правильно описывать закодированный узел.
Почему : из-за стратегии кодирования base64 / 63, uuencode et al. кодирование увеличивает объем данных (накладные расходы), которые необходимо хранить и передавать, примерно на 40% (по сравнению с 1-2% yEnc). В зависимости от того, что вы кодируете, 40% накладных расходов могут стать проблемой.
yEnc - аннотация Википедии: https://en.wikipedia.org/wiki/YEnc yEnc - это схема кодирования двоичного кода в текст для передачи двоичных файлов в сообщениях в Usenet или по электронной почте. ... Дополнительным преимуществом yEnc перед предыдущими методами кодирования, такими как uuencode и Base64, является включение контрольной суммы CRC для проверки того, что декодированный файл был доставлен без изменений. Взаимодействие с другими людьми
источник
Вы также можете Uuencode исходные двоичные данные. Этот формат немного старше, но выполняет то же самое, что и кодировка base63.
источник
Если у вас есть контроль над форматом XML, вы должны вывернуть проблему наизнанку. Вместо того, чтобы прикреплять двоичный XML, вы должны подумать о том, как заключить документ, состоящий из нескольких частей, одна из которых содержит XML.
Традиционным решением этой проблемы является архив (например, tar). Но если вы хотите сохранить прилагаемый документ в текстовом формате или если у вас нет доступа к библиотеке архивирования файлов, существует также стандартизированная схема, которая широко используется в электронной почте и HTTP, которая является multipart / * MIME с Content-Transfer-Encoding: двоичный .
Например, если ваши серверы обмениваются данными через HTTP, и вы хотите отправить составной документ, основным из которых является XML-документ, который ссылается на двоичные данные, HTTP-связь может выглядеть примерно так:
Как и в приведенном выше примере, XML ссылается на двоичные данные во включающем multipart с помощью
cid
схемы URI, которая является идентификатором заголовка Content-Id. Накладные расходы этой схемы будут только заголовком MIME. Похожая схема также может использоваться для HTTP-ответа. Конечно, в протоколе HTTP у вас также есть возможность отправить составной документ в отдельный запрос / ответ.Если вы хотите избежать упаковки данных в составную часть, следует использовать URI данных:
Но это накладные расходы base64.
источник