100% ローカル — データがブラウザの外に出ることはありません

XMLをJSONに変換|属性も要素もそのまま取り出せる形にする

XMLをJSONに変換します。属性も繰り返し要素もテキストも、コードからドットや角括弧でそのまま届く場所に収まり、専用のXMLパーサを書き足す手間がなくなります。

高速 プライベート Cookieゼロ
インデント

XML 入力

JSON 出力

このツールの動作

各要素がキーになり、その子が値になります。

<user id="1"><name>Ada</name></user>
{ "user": { "name": "Ada", "@_id": "1" } }

モデルが食い違う三か所

XML と JSON は同じ形を記述しません。どの変換器も決めるほかなく、以下がその決めごとです。

属性

@_ を付けたキーになります。JSON のメンバーは一種類ですが、XML には属性と要素があり、同じ名前を持てます。<user id="1"><id>2</id></user> には id という別々のものが二つあります。接頭辞がそれを分けます。不要なら切り替えで落とせます。

テキストと属性を同時に持つ要素では、テキストは #text の下に入ります。

繰り返し

<item> が一つならオブジェクト、二つなら配列です。

<r><i>1</i></r>          →  { "r": { "i": 1 } }
<r><i>1</i><i>2</i></r>  →  { "r": { "i": [1, 2] } }

これは直せる欠陥ではありません。その要素が繰り返し得るかどうかは XML 文書のどこにも書かれていません。 知っているのはスキーマだけです。コードがリストを前提とするなら、受け取った時点で正規化してください。

混在内容

これは JSON が表現できないもので、はっきり言っておくべき点です。

<p>こんにちは <b>世界</b> また</p>

こんにちは が <b> の前にあり、また が後ろにあったことを、JSON は表せません。テキストの断片は #text の下にまとめられ、要素に対する位置が失われます。間の空白も同様です。大事なのがテキストであるなら——記録ではなく文書であるなら——変換せず、XML フォーマッターをお使いください。

型

<a>1</a> は数値 1 になります。<a>007</a> は文字列 "007" になります。先頭のゼロは通常、郵便番号や口座番号であり、7 と読めばそれを失うからです。二十桁の識別子も文字列のままです。JSON の数値では丸められてしまいます。

データではないもの

XML 宣言と処理命令は落とします。これらは文書についての記述であって、文書の内容ではありません。根要素の隣に並ぶ ?xml というキーは、あなたが求めた情報ではありませんでした。

プライバシー

すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。

よくある質問

なぜ <item> が一つだと配列ではなくオブジェクトになるのですか。
XML 文書のどこにも、その要素が繰り返されるかどうかは書かれていないからです。`<item>` が一つある状態は、要素数 1 のリストと見分けがつきません。区別できるのはスキーマだけです。二つ以上なら配列、一つならオブジェクトになります。受け取る側がどちらでもリストを要るなら、そちらで正規化してください。`Array.isArray(x) ? x : [x]` が通例の一行です。
なぜ属性には @_ が付くのですか。
JSON のメンバーは一種類ですが、XML には二種類あるからです。`<user id="1"><id>2</id></user>` には `id` という名前の属性と要素が別物として同居します。接頭辞がなければ一方が他方を上書きします。属性が不要なら、切り替えで丸ごと落とせます。
なぜ <a>007</a> は文字列のままで <a>7</a> は数値になるのですか。
先頭のゼロはほとんどの場合意味を担っているからです。郵便番号、口座番号、部品番号など。`007` を数値の 7 と読めば、それは二度と戻りません。先頭ゼロのない数値は変換します。二十桁の識別子のように JSON の数値が正確に保持できないものは、同じ理由で文字列のままにします。

関連ツール