📄 XML ⇔ JSON 変換
XML と JSON を相互変換します。属性プレフィックス・テキストノードキー・CDATA・配列自動検出に対応。RSS / SOAP のような複雑な XML も扱えます。
🔒 プライバシーについて
- ・すべての処理はあなたのブラウザ内で完結します
- ・入力データは一切サーバーに送信されません
🔗 関連ツール
📖 つまずきやすいポイント
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:encoded、media:thumbnail、itunes:duration など)。さらに厄介なのは、接頭辞は文書ごとに自由に決められることです — 同じ名前空間 URI でも、あるフィードは dc:、別のフィードは dcterms: を使うので、接頭辞を決め打ちしたコードは他のフィードで動きません。 |
アクセスはブラケット記法 obj["dc:creator"] で書いてください。TypeScript の型定義でも同様に引用符付きのキー名で宣言できます。接頭辞のゆらぎに対処するなら、取り込み時に正規化するのが唯一の現実的な方法です — 接頭辞を落として creator にするか、名前空間 URI で解決してから自前の短い名前に付け替えます。ただし単に接頭辞を落とすと衝突しうる点に注意してください (dc:date と atom: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
方向とオプションを設定XML → JSON または JSON → XML を選び、属性プレフィックス・テキストキー・インデントを指定します。
-
2
データを入力左側に XML または JSON を貼り付けます。サンプルボタンで RSS や属性付き JSON を読み込めます。
-
3
結果をコピーまたはダウンロード変換結果が右側にリアルタイム表示されます。コピーやダウンロードボタンで保存できます。
❓ よくある質問
属性とテキストノードはどう表現されますか?
CDATA セクションは扱えますか?
同じタグが複数あるときに配列になりますか?
🐛 このツールで問題が発生しましたか?
完全無料・登録不要。再現手順だけでも結構です。届いたご報告は運営者に直接届き、修正の参考にします。
ご報告ありがとうございます!
運営者に届きました。改善の参考にさせていただきます。