Как встраивать двоичные данные в XML?

голоса
97

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

UPDATE: Я получил эту работу с Base64 класса из библиотеки Apache Commons кодеком , в случае , если кто - то пытается что - то подобное.

Задан 21/08/2008 в 14:35
источник пользователем
На других языках...                            


13 ответов

голоса
194

Можно кодировать двоичные данные с помощью base64 и поместить его в элемент Base64; ниже статья является довольно хорошим по этому вопросу.

Обработка двоичных данных в XML-документах

Ответил 21/08/2008 d 14:37
источник пользователем

голоса
190

XML является настолько универсальным ...

<DATA>
  <BINARY>
    <BIT index="0">0</BIT>
    <BIT index="1">0</BIT>
    <BIT index="2">1</BIT>
    ...
    <BIT index="n">1</BIT>
  </BINARY>
</DATA>

XML, как насилие - Если это не решит вашу проблему, вы не используете достаточно.

РЕДАКТИРОВАТЬ:

КСТАТИ: Base64 + CDATA, вероятно, является лучшим решением

(EDIT2:
. Кто upmods меня, пожалуйста , также upmod реальный ответ Мы не хотим , бедняжка , чтобы прийти сюда и на самом деле реализовать мой метод , потому что это был самый высокий рейтинг на SO, правда?)

Ответил 21/08/2008 d 14:46
источник пользователем

голоса
22

Base64 это действительно правильный ответ , но CDATA не в том, что это в основном говорят: «это может быть что угодно», однако он должен не быть только что - нибудь, он должен быть в кодировке Base64 двоичных данных. XML Schema определяет базы 64 бинарного как примитивный тип данных , которые вы можете использовать в вашем XSD.

Ответил 21/08/2008 d 18:44
источник пользователем

голоса
9

У меня была эта проблема только на прошлой неделе. Я должен был сериализации файл PDF и отправить его, внутри файла XML, на сервер.

Если вы используете .NET, вы можете преобразовать двоичный файл непосредственно в строку base64 и вставить его внутри элемента XML.

string base64 = Convert.ToBase64String(File.ReadAllBytes(fileName));

Или есть метод построен прямо в объект XmlWriter. В моем конкретном случае, я должен был включать в себя тип данных имен от Microsoft:

StringBuilder sb = new StringBuilder();
System.Xml.XmlWriter xw = XmlWriter.Create(sb);
xw.WriteStartElement("doc");
xw.WriteStartElement("serialized_binary");
xw.WriteAttributeString("types", "dt", "urn:schemas-microsoft-com:datatypes", "bin.base64");
byte[] b = File.ReadAllBytes(fileName);
xw.WriteBase64(b, 0, b.Length);
xw.WriteEndElement();
xw.WriteEndElement();
string abc = sb.ToString();

Строка а выглядит то, что выглядит следующим образом:

<?xml version="1.0" encoding="utf-16"?>
<doc>
    <serialized_binary types:dt="bin.base64" xmlns:types="urn:schemas-microsoft-com:datatypes">
        JVBERi0xLjMKJaqrrK0KNCAwIG9iago8PCAvVHlwZSAvSW5mbw...(plus lots more)
    </serialized_binary>
</doc>
Ответил 03/08/2010 d 22:35
источник пользователем

голоса
6

Я обычно кодировать двоичные данные с MIME Base64 или кодирования URL .

Ответил 21/08/2008 d 14:38
источник пользователем

голоса
5

Попробуйте Base64 кодирование / декодирование ваших двоичных данных. Также обратите внимание на разделы CDATA

Ответил 21/08/2008 d 14:37
источник пользователем

голоса
4

Может кодировать их в известный набор - что-то вроде базы 64 является популярным выбором.

Ответил 21/08/2008 d 14:37
источник пользователем

голоса
3

Base64 накладные расходы составляют 33%.

BaseXML для XML1.0 накладных расходов составляет только 20% . Но это не является стандарт и только реализация C еще. Проверьте это , если вы обеспокоены размером данных. Обратите внимание , что , однако , как правило , браузеры осуществлять сжатие так , что она меньше нужна.

Я разработал его после обсуждения в этой теме: Кодирование двоичных данных в пределах XML: альтернативы base64 .

Ответил 04/07/2013 d 23:32
источник пользователем

голоса
3

Любое кодирование двоичной в текст будет делать трюк. Я использую что - то подобное

<data encoding="yEnc>
<![CDATA[ encoded binary data ]]>
</data>
Ответил 01/07/2010 d 09:31
источник пользователем

голоса
2

Не используйте кодировку base64, поскольку это увеличивает количество данных, которые необходимо хранить, по крайней мере, на 40%. Скорее использовать другие методы кодирования, как yEnc.

Ответил 17/02/2012 d 11:01
источник пользователем

голоса
2

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

Ответил 31/08/2008 d 17:52
источник пользователем

голоса
0

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

Традиционное решение это архив (например , смолы). Но если вы хотите сохранить ограждающий документ в текстовом формате или если у вас нет доступа к библиотеке архивирования файлов, есть также стандартизированная схема, которая активно используются в электронной почте и HTTP , который многочастный / * 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 - бинарных данных в вмещающих Multipart с использованием cidсхемы URI , который является идентификатором для заголовка Content-Id. Накладные этой схемы будет только заголовок MIME. Подобная схема также может быть использована для ответа HTTP. Конечно , в протоколе HTTP, у вас также есть возможность отправки составного документа в отдельный запрос / ответ.

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

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

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

Ответил 10/12/2014 d 08:42
источник пользователем

голоса
0

Вот хороший пример того , как приступить XEP-0239

PS: не забудьте прочитать ответ Мо .

PS2: прочитайте раздел Уведомления о XEP.

Ответил 04/08/2010 d 01:41
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more