コンテンツにスキップ

📄 XML ⇔ JSON 変換

XML と JSON を相互変換します。属性プレフィックス・テキストノードキー・CDATA・配列自動検出に対応。RSS / SOAP のような複雑な XML も扱えます。

完全無料 登録不要 ブラウザ完結 5 言語対応 ダークモード

🔒 プライバシーについて

📖 つまずきやすいポイント

XML と JSON を相互に変換します。属性のプレフィックス・テキストノードのキー名・CDATA・配列の自動検出に対応し、RSS や SOAP のような入り組んだ XML も扱えます。処理はブラウザ内で完結します。ただしこの 2 つはデータモデルが違うので、変換は本質的に非可逆です — XML → JSON → XML と往復させても、元のファイルには戻りません。片方向の取り込みに使うものだと考えてください。

ケース 何が起きるか どうする
往復させたら XML が別物になった JSON には属性という概念も、要素の順序を保つ仕組みも、コメントもありません。したがって往復で失われるものは多岐にわたります — 属性の記述順、名前空間の接頭辞 (ns1:ns2: に変わっても XML としては同値)、<a/><a></a> の書き分け、コメント、DOCTYPE、処理命令、要素間の空白。とくに重大なのは電子署名ですXMLDSig は「バイト列そのもの」に対して署名するので、往復させた時点で検証に失敗します。SOAP や電子インボイスを扱う場面では致命的です。 往復させない設計にしてください。XML を受け取ってアプリ内で使うなら JSON に変換し、返すべき XML は元のファイルをそのまま保持しておくか、テンプレートから生成し直します。署名や検証が絡む場面では、そもそも XML のまま扱えるライブラリを使うのが正解です (JSON への変換は、あくまで人間が中身を読むための補助と割り切ってください)。変換が可逆かどうかを確かめたいなら、往復させた結果を元ファイルと diff するのがいちばん早いです — 問題が起きてから気付くより、最初に 1 回試して限界を把握しておくほうが安全です。
同じタグが 1 件のときだけ配列にならない 「配列自動検出」は実際の出現回数で判断します。したがって <item> が 3 件あれば配列に、1 件しかなければオブジェクトになります。同じスキーマの XML なのにデータの中身によって JSON の形が変わるということで、受け側のコードは items.map(...) で落ちます。これは XML → JSON 変換で最も頻繁に踏まれるバグで、しかもテスト用のサンプルには複数件入っていることが多いため、本番で「たまたま 1 件だった日」に初めて壊れます。RSS フィードや検索結果の取り込みで典型的に起こります。 スキーマが分かっているなら、その要素は常に配列として扱ってください。多くのライブラリには alwaysArray / arrayNotation といったオプションがあり、タグ名を列挙して「これは必ず配列」と宣言できます。ライブラリ側で指定できない場合は、受け側で const list = [].concat(data.items?.item ?? []) のように正規化するのが確実です — この 1 行を書く習慣を付けるだけで、この種の障害はほぼ消えますテストデータには必ず「0 件」「1 件」「複数件」の 3 パターンを入れてください — 実際に壊れるのは前 2 つで、そして前 2 つはサンプルに入っていないのが普通です。
名前空間の付いたキーが JavaScript で扱いにくい <dc:creator> は JSON では "dc:creator" というキーになります。コロンを含むのでドット記法で書けずobj.dc:creator は構文エラーです。RSS や Atom は名前空間を必ず使うので、フィードを扱うと確実に当たります (content:encodedmedia:thumbnailitunes:duration など)。さらに厄介なのは、接頭辞は文書ごとに自由に決められることです — 同じ名前空間 URI でも、あるフィードは dc:、別のフィードは dcterms: を使うので、接頭辞を決め打ちしたコードは他のフィードで動きません アクセスはブラケット記法 obj["dc:creator"] で書いてください。TypeScript の型定義でも同様に引用符付きのキー名で宣言できます。接頭辞のゆらぎに対処するなら、取り込み時に正規化するのが唯一の現実的な方法です — 接頭辞を落として creator にするか、名前空間 URI で解決してから自前の短い名前に付け替えます。ただし単に接頭辞を落とすと衝突しうる点に注意してください (dc:dateatom:date が両方 date になる)。実際のフィードを 5 本ほど集めて試すと、想定していない接頭辞がすぐ見つかります — 仕様書を読むより速い確認方法です。

数値に見える文字列に注意してください。XML はすべてテキストなので <zip>007-0000</zip><tel>+81...</tel> も文字列ですが、変換の実装によっては「数値らしきもの」を自動で数値に変換します — その瞬間に先頭のゼロが消え、1e5 は 100000 になり、+81 は 81 になります。郵便番号・電話番号・製品コード・バージョン番号は、必ず文字列のまま扱う設定にしてください。もう 1 点、外部から受け取った XML をサーバー側でパースするときは XXE (外部実体参照) に注意してください — ブラウザの DOMParser は外部実体を展開しないので、このページの処理は安全ですが、サーバー側のパーサーは実装によって既定で有効です。PHP なら LIBXML_NOENT を渡さない、Java なら setFeature で外部実体を無効化する、といった対策が要ります。「ローカルファイルの中身が抜かれる」という古典的な脆弱性ですが、いまも普通に見つかります。

📖 使い方

  1. 1
    方向とオプションを設定
    XML → JSON または JSON → XML を選び、属性プレフィックス・テキストキー・インデントを指定します。
  2. 2
    データを入力
    左側に XML または JSON を貼り付けます。サンプルボタンで RSS や属性付き JSON を読み込めます。
  3. 3
    結果をコピーまたはダウンロード
    変換結果が右側にリアルタイム表示されます。コピーやダウンロードボタンで保存できます。

❓ よくある質問

属性とテキストノードはどう表現されますか?
属性は接頭辞付きキー(例: @id)、テキストノードは指定キー(例: #text)として保持されます。プレフィックスとキー名はオプションで変更できます。
CDATA セクションは扱えますか?
はい。XML → JSON では CDATA の中身がそのままテキストとして格納されます。JSON → XML ではエスケープが必要な文字を含む値を自動的に CDATA で囲みます。
同じタグが複数あるときに配列になりますか?
「配列自動検出」を有効にすると、同名タグが 2 つ以上ある場合に自動で配列としてまとめます。無効にすると最初の出現を上書きします。
🐛 このツールで問題が発生しましたか?

完全無料・登録不要。再現手順だけでも結構です。届いたご報告は運営者に直接届き、修正の参考にします。

※ 不具合再現のため、ブラウザ情報 (UA / 画面サイズ / 言語 / URL) を自動で送信します