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



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



обновление: я получил эту работу с Base64 класс библиотека кодеков Apache commons в случае, если кто-то еще пробовал что-то подобное.

1009   13  

13 ответов:

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

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

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-это как насилие - если это не решает вашу проблему, вы не используете достаточно.

EDIT:

кстати: Base64 + CDATA, вероятно, лучшее решение

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

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

у меня была такая проблема только на прошлой неделе. Мне пришлось сериализовать 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();

строка abc выглядит что-то вроде это:

<?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>

обычно я кодирую двоичные данные с помощью MIME Base64 или кодировка URL.

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

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

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

<data encoding="yEnc>
<![CDATA[ encoded binary data ]]>
</data>

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

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

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

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

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

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

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

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

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

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

например, если ваши серверы взаимодействуют через 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.

Comments

    Ничего не найдено.