XML から JSON への変換
左側に XML を貼り付けると、右側に JSON が表示されます。属性は @_ プレフィックスで保持。アップロード不要。
- 左側のテキストエリアに XML を貼り付けます。
- 「JSON に変換」をクリック。要素のネストはネストされたオブジェクトになります。
- JSON をコピーするか、data.json としてダウンロードします。
- 繰り返される子要素は自動的に配列に折りたたまれます。
何ができるのか?
fast-xml-parser の規約を使って XML を JSON オブジェクトにパースします: 子要素はオブジェクトプロパティになり、繰り返される子は配列になり、属性は親オブジェクトに `@_` プレフィックス付きで保持され、混合ノードのテキストコンテンツは `#text` キーに入ります。数値とブールの属性値は `parseAttributeValue: true` で自動型付けされます — XML の `count="42"` は `"@_count": 42` としてラウンドトリップし、文字列 `"42"` ではありません。
例
XML 入力:
<root version="1">
<name>Ada</name>
<tags>math</tags>
<tags>logic</tags>
</root> JSON 出力:
{
"root": {
"@_version": 1,
"name": "Ada",
"tags": ["math", "logic"]
}
} よくある XML の落とし穴と対処法
XML には JSON にはないコーナーケースがあります。これらは予想外の出力を生むパターンです。
- 単一の子 vs. 複数の子。 `<a><b/></a>` は `{"a":{"b":""}}` (オブジェクトプロパティとしての単一の子) を生成しますが、`<a><b/><b/></a>` は `{"a":{"b":["",""]}}` (配列としての複数) を生成します。下流のコードが常に配列を期待しているなら、変換後に正規化してください。
- 属性 vs. 子要素。 属性は子と同じレベルに `@_` プレフィックス付きで現れます。`<user id="1"><name>Ada</name></user>` は `{"user":{"@_id":1,"name":"Ada"}}` になります。一部のツールは属性をプロパティに統合しますが、それはここで使われている規約とは異なります。
- 混在コンテンツ (テキスト + 子要素)。 `<p>Hello <b>world</b></p>` は `{"p":{"#text":"Hello ","b":"world"}}` を生成します。テキストはキャプチャされますが、子に対する位置は失われます — JSON には順序付き混在コンテンツを表現する方法がないためです。ほとんどの設定スタイル XML はこのケースに該当しません。
- 名前空間。 名前空間 (`<x:foo xmlns:x="...">`) は要素名の一部 (`x:foo`) として保持されます。多くの XML 消費者はプレフィックスを削除しますが、必要なら後処理ステップとして実行してください。
- CDATA セクション。 `<![CDATA[some text]]>` はプレーンテキストとしてパースされ、親の `#text` に統合されます。CDATA フレーミングは失われます — ほとんどのケースでは問題ありませんが、フレーミングが意味的に重要だった場合は注意が必要です。
- 自己終了 vs. 空。 `<x/>` と `<x></x>` は XML で同等で、同じ JSON 出力 (値は `""`) を生成します。元のフレーミングは JSON から復元できません。
よくある質問
なぜ私の出力では属性に `@_` プレフィックスが付いているのですか?
XML 属性と子要素を区別するためです。プレフィックスがない場合、`<user id="1"><id>foo</id></user>` には 2 つの `id` キーが存在することになります — JSON オブジェクトは 1 つしか持てません。プレフィックスは両方をラウンドトリップ可能に保ちます。プレフィックスが不要なら、後処理で `"@_"` を `""` に置換してください (衝突リスクを受け入れて)。
ラップしているルートキーなしで JSON を取得できますか?
XML には常に単一のルート要素があります。JSON はラウンドトリップ可能性のためにそのラップを保持します。内部のオブジェクトが欲しい場合は、変換後に剥がしてください — `result` ではなく `result.root`。
XML コメントは保持されますか?
いいえ。JSON にはコメント構文がなく、パーサは XML コメントを無視するように設定されています。コメントを保持する必要があるなら、それをサポートする別の中間表現を使う必要があります。
属性値は型付けされますか?
はい — `parseAttributeValue: true` が設定されているので、`count="42"` は `"@_count": 42` (数値) になり、`enabled="true"` は `"@_enabled": true` (ブール) になります。属性を文字列として必要なら、後処理するか設定をフォークしてください。
私の XML はアップロードされますか?
いいえ。すべてはあなたのブラウザで実行されます — XML はこのページの JavaScript で解析され、サーバーに送信されることはありません。ブラウザの開発者ツールで確認できます。
非常に大きな XML ファイルを処理できますか?
テキストエリアが遅くなる前に約 30 MB まで対応できます。パーサは線形にスケールします。より大きな入力には、コマンドラインで fast-xml-parser を実行してください — 同じライブラリです。