Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
951
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1726
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4399
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как вы внедряете двоичные данные в XML?
У меня есть два приложения, написанные на Java, которые взаимодействуют друг с другом с помощью XML сообщений по сети. Я использую парсер SAX на приемном конце, чтобы получить данные обратно из сообщений. Одним из требований является встраивание двоичных данных в сообщение XML, но SAX это не нравится. Кто-нибудь знает, как это сделать?
UPDATE: я получил это, работая с классом Base64 из библиотеки кодеков apache commons, На случай, если кто-то еще пытается сделать что-то подобное.
Вы можете закодировать двоичные данные с помощью 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:
BTW: Base64 + CDATA, вероятно, лучшее решение
(EDIT2:
Тот, кто поднимает меня, пожалуйста, также поднимает настоящий ответ. Мы же не хотим, чтобы какой-нибудь бедолага пришел сюда и фактически реализовал мой метод, потому что он был самым высоким рангом на SO, верно?)
Base64-это действительно правильный ответ, но CDATA-нет, это в основном говорит: "это может быть что угодно", однако это не должно быть просто что-то, это должны быть Base64 закодированные двоичные данные. Схема XML определяет base 64 binary как примитивный тип данных, который можно использовать в вашем 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>
Любая кодировка binary-to-text сделает трюк. Я использую что-то вроде этого
<data encoding="yEnc>
<![CDATA[ encoded binary data ]]>
</data>
Хотя другие ответы в основном хороши, вы можете попробовать другой, более экономичный метод кодирования, например yEnc. ( Ссылка на Википедию yEnc) с помощью yEnc также можно получить контрольную сумму справа "out of the box". Читайте и ссылки ниже. Конечно, поскольку XML не имеет собственного типа yEnc, ваша схема XML должна быть обновлена, чтобы правильно описать закодированный узел.
Почему: из-за стратегий кодирования base64/63, uuencode et al. кодировки увеличивают объем данных (накладные расходы), которые необходимо хранить и передавать примерно на 40% (против yEnc - это 1-2%). в зависимости от того, что вы кодируете, 40% накладные расходы могут быть/стать проблемой.
yEnc-Википедия аннотация: https://en.wikipedia.org/wiki/YEnc yEnc-это схема кодирования binary-to-text для передачи двоичных файлов в сообщениях на Usenet или по электронной почте. ... Дополнительным преимуществом yEnc по сравнению с предыдущими методами кодирования, такими как uuencode и Base64, является включение контрольной суммы CRC для проверки того, что декодированный файл был доставлен в целости и сохранности.
Base64 накладные расходы составляют 33%.
BaseXML для XML1.0 накладные расходы-это только 20% . Но это не стандарт, и пока есть только реализация C. Проверьте это, если вас интересует размер данных. Обратите внимание, что, однако, браузеры склонны реализовывать сжатие так, чтобы оно было менее необходимым.
Я разработал его после обсуждения в этой теме: кодирование двоичных данных в пределах XML: альтернативы base64 .
Если у вас есть контроль над форматом XML, вы должны вывернуть проблему наизнанку. Вместо того, чтобы прикреплять двоичный XML, вы должны подумать о том, как вложить документ, который имеет несколько частей, одна из которых содержит XML.
Традиционным решением для этого является архив (например, tar). Но если вы хотите сохранить вложенный документ в текстовом формате или если у вас нет доступа к библиотеке архивирования файлов, существует также стандартизированная схема, которая широко используется в email и 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 у вас также есть возможность отправить составной документ в отдельный request/response.
Если вы хотите избежать обертывания ваших данных в составную часть, используйте data URI:
<myxml>
<data href="data:application/something;charset=utf-8;base64,dGVzdGRhdGE="/>
</myxml>
Но у этого есть накладные расходы base64.