Как закодировать XML в Base64
- Вставьте XML-документ в поле Ввод · текст или нажмите Пример, чтобы загрузить небольшой образец.
- В поле Кодировка укажите кодировку из XML-объявления. По умолчанию выбрана UTF-8: она подходит для большинства документов.
- Скопируйте результат из поля Результат · Base64. Для полей JSON и HTTP оставьте Перенос строк в положении «Нет»; некоторые протоколы на базе XML принимают строки по 76 символов.
- Скачать сохраняет Base64 в файл
base64.txt.
Пример (XML-объявление и элемент <note>) кодируется в строку, которая начинается с PD94bWwg, то есть с Base64 от <?xml . Так начинается почти любой XML-документ с объявлением, поэтому закодированный XML легко узнать. Base64 в XML декодирует его обратно.
Кодировка должна совпадать с XML-объявлением
Как читать байты, XML-парсер решает по атрибуту encoding в объявлении (или по метке порядка байтов). Если байты и объявление расходятся, получатель прочитает не те символы, что вы написали.
| Документ | Кодировка здесь | Base64 | Парсер прочитает |
|---|---|---|---|
<?xml version="1.0" encoding="ISO-8859-1"?><n>café</n> | ISO-8859-1 | PD94bWwg...PjxuPmNhZuk8L24+ | café |
| Тот же документ | UTF-8 | PD94bWwg...PjxuPmNhZsOpPC9uPg== | café |
Вторая строка показывает классическую ошибку интеграции: текст сохранён в UTF-8, а в объявлении по-прежнему Latin-1. Либо выберите здесь объявленную кодировку, либо (что лучше) поменяйте объявление на UTF-8 и используйте UTF-8 везде.
Где XML передают в Base64
- SOAP и REST API, которые принимают целый XML-документ внутри поля JSON или XML, чтобы угловые скобки и кавычки не нужно было экранировать. Сервисы электронных счетов и EDI часто принимают так счета (например, документы UBL).
- Единый вход через SAML. Браузер отправляет ответ SAML как XML-документ, закодированный в Base64. Декодер SAML превращает значения
SAMLResponseиSAMLRequestобратно в XML. - Конфигурация и секреты. XML-конфиги в переменных окружения или секретах Kubernetes хранят в Base64, чтобы они умещались в одну строку.
Если документ подписан (XML-DSig, который используют SAML и многие схемы электронных счетов), кодируйте ровно те байты, что вы получили или сформировали. Новые отступы, другие окончания строк или пересохранение файла в редакторе могут сделать подпись недействительной, хотя смысл XML не изменится.
Размер и перенос строк
Base64 увеличивает документ примерно на 33%. XML и так многословен, поэтому большие документы часто сжимают gzip перед кодированием; инструмент gzip и Base64 делает оба шага. Перенос строк по 76 символов принимают транспорты на базе MIME и большинство валидаторов XML Schema для содержимого xs:base64Binary. API на JSON обычно ждут одну неразрывную строку.
XML в Base64 в коде
Читайте файл как байты и кодируйте их, тогда объявление и байты не разойдутся:
import base64
with open("invoice.xml", "rb") as f:
b64 = base64.b64encode(f.read()).decode("ascii")
// Node.js
const fs = require("fs");
const b64 = fs.readFileSync("invoice.xml").toString("base64");
В Linux base64 -w 0 invoice.xml выводит ту же самую одну строку. Потоковую обработку больших файлов описывают статьи Base64 в Python и Base64 в Node.js.
Вопросы и ответы
Как перевести XML-файл в Base64?
Вставьте XML выше и скопируйте результат. Для файлов кодируйте сами байты, а не перепечатанный текст: base64.b64encode(open("doc.xml", "rb").read()) в Python или base64 -w 0 doc.xml в Linux.
Какую кодировку выбрать для XML?
Ту, что указана в XML-объявлении. <?xml version="1.0" encoding="UTF-8"?> или отсутствие атрибута encoding означает UTF-8, кодировку по умолчанию. Если там ISO-8859-1 или Windows-1252, выберите её или поменяйте объявление на UTF-8.
Можно ли переформатировать XML перед кодированием?
Только если ничто не зависит от точных байтов. Отступы меняют Base64, а у подписанного XML (SAML-утверждения, подписанные счета) могут сломать подпись.
При чём тут xs:base64Binary?
Этот тип XML Schema описывает обратный случай: Base64 внутри XML-элемента, которым встраивают файлы в SOAP-сообщения и счета. Закодируйте файл через Файл в Base64 и вставьте результат в элемент.