XML を Base64 にエンコードする方法
- XML 文書を 入力 · テキスト に貼り付けるか、サンプル を押して小さな文書を読み込みます。
- 文字コード を XML 宣言に書かれたエンコードに合わせます。UTF-8 が選択済みで、ほとんどの文書ではこれで正解です。
- 出力 · Base64 から結果をコピーします。JSON や HTTP のフィールドでは 折り返し を「なし」のままにしてください。76 文字の行を受け付ける XML ベースのプロトコルもあります。
- ダウンロード で Base64 を
base64.txtとして保存します。
XML 宣言の後に <note> 要素が続くサンプルは、PD94bWwg で始まる文字列にエンコードされます。これは <?xml の Base64 です。宣言のある 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é |
2 行目はシステム連携でよくあるバグです。テキストは UTF-8 で保存されているのに、宣言は Latin-1 のままになっています。ここで宣言どおりの文字コードを選ぶか、より望ましい方法として、宣言を UTF-8 に変えてどこでも UTF-8 を使ってください。
XML が Base64 で運ばれる場面
- SOAP や REST の API。 JSON や XML のフィールドの中に XML 文書全体を受け取るもので、Base64 にすれば山括弧や引用符のエスケープが不要になります。電子インボイスや EDI のサービスでは、インボイス(たとえば UBL 文書)をこの方法で受け取ることがよくあります。
- SAML シングルサインオン。 SAML レスポンスは XML 文書で、Base64 エンコードしてブラウザから POST されます。SAML デコーダー は
SAMLResponseとSAMLRequestの値を XML に戻します。 - 設定とシークレット。 環境変数や Kubernetes の Secret に保存する XML の設定ファイルは、1 行に収めるために Base64 にします。
文書がデジタル署名されている場合(SAML や多くの電子インボイスで使われる XML-DSig)は、受け取ったか生成したとおりのバイト列をエンコードしてください。XML の意味が同じでも、インデントのやり直し、改行コードの変更、エディターでの保存し直しで署名が無効になることがあります。
サイズと折り返し
Base64 は文書を約 33% 大きくします。XML はもともと冗長なので、大きな文書はエンコードの前に gzip することがよくあります。gzip と Base64 のツール で両方の手順を行えます。76 文字での 折り返し は、MIME ベースの転送や、xs:base64Binary の内容に対するほとんどの XML Schema バリデーターで受け付けられます。JSON ベースの API は通常、途切れのない 1 行を想定しています。
コードで 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 で同じ 1 行が出力されます。大きなファイルのストリーム処理については Python での Base64 と Node.js での Base64 を参照してください。
よくある質問
XML ファイルを Base64 に変換するには?
上に XML を貼り付けて結果をコピーします。ファイルの場合は、テキストを打ち直すのではなく生のバイト列をエンコードしてください。Python なら base64.b64encode(open("doc.xml", "rb").read())、Linux なら base64 -w 0 doc.xml です。
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 の型は逆のケースで、XML 要素の中に Base64 を入れるものです。SOAP メッセージやインボイスにファイルを埋め込むのに使われます。ファイルを Base64 に でファイルをエンコードし、結果を要素に貼り付けてください。