XML から JSON への変換

左側に XML を貼り付けると、右側に JSON が表示されます。属性は @_ プレフィックスで保持。アップロード不要。

  1. 左側のテキストエリアに XML を貼り付けます。
  2. 「JSON に変換」をクリック。要素のネストはネストされたオブジェクトになります。
  3. JSON をコピーするか、data.json としてダウンロードします。
  4. 繰り返される子要素は自動的に配列に折りたたまれます。
何ができるのか?

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 を実行してください — 同じライブラリです。