Как вы встраиваете двоичные данные в XML? - PullRequest
103 голосов
/ 21 августа 2008

У меня есть два приложения, написанные на Java, которые общаются друг с другом с помощью XML-сообщений по сети. Я использую синтаксический анализатор SAX на принимающей стороне, чтобы вернуть данные из сообщений. Одним из требований является встраивание двоичных данных в сообщение XML, но SAX это не нравится. Кто-нибудь знает, как это сделать?

ОБНОВЛЕНИЕ: Я получил это, работая с классом Base64 из библиотеки кодеков apache commons , на случай, если кто-то еще попробует нечто подобное.

Ответы [ 12 ]

2 голосов
/ 31 августа 2008

Вы также можете Uuencode свои исходные двоичные данные. Этот формат немного старше, но он делает то же самое, что и кодировка base63.

0 голосов
/ 10 декабря 2014

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

Традиционным решением для этого является архив (например, tar). Но если вы хотите сохранить вложенный документ в текстовом формате или если у вас нет доступа к библиотеке архивирования файлов, есть также стандартизированная схема, которая интенсивно используется в электронной почте и HTTP, и это multipart / * MIME с Content-Transfer-Encoding: двоичное .

Например, если ваши серверы обмениваются данными по протоколу HTTP и вы хотите отправить многокомпонентный документ, основным из которых является документ XML, который ссылается на двоичные данные, связь HTTP может выглядеть примерно так:

POST / HTTP/1.1
Content-Type: multipart/related; boundary="qd43hdi34udh34id344"
... other headers elided ...

--qd43hdi34udh34id344
Content-Type: application/xml

<myxml>
    <data href="cid:data.bin"/>
</myxml>
--qd43hdi34udh34id344
Content-Id: <data.bin>
Content-type: application/octet-stream
Content-Transfer-Encoding: binary

... binary data ...
--qd43hdi34udh34id344--

Как и в приведенном выше примере, XML ссылается на двоичные данные во включающем множественном элементе с использованием схемы cid URI, которая является идентификатором заголовка Content-Id. Издержки этой схемы будут просто заголовком MIME. Аналогичная схема также может быть использована для ответа HTTP. Разумеется, в протоколе HTTP у вас также есть возможность отправить составной документ в отдельный запрос / ответ.

Если вы хотите избежать переноса данных в несколько частей, используйте URI данных:

<myxml>
    <data href="data:application/something;charset=utf-8;base64,dGVzdGRhdGE="/>
</myxml>

Но это накладные расходы base64.

...