piapia123
ja

XML ↔ JSON

整形

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

⚠️ この変換は本質的に可逆ではありません。しかも失われるものは見た目より多い。 XML と JSON はデータモデルが違い、同じものの 2 通りの表記ではありません: · 属性と子要素 —— `<a b="1"/>` と `<a><b>1</b></a>` は XML では別のものです(メタデータか内容か)。JSON では `@` 接頭辞で区別し、戻せば復元できます。 · 混合内容 —— `<p>前<b>太字</b>後</p>` ではテキストと要素が交互に並びます。JSON のオブジェクトに順序の概念はないため、その構造は必然的に失われます。 · 繰り返しタグ —— 2 つなら配列、1 つなら単一値になるため、「1 つある」と「1 つしかありえない」の区別が JSON では付きません。戻すと要素 1 つの配列は単一要素になります。 · コメント・処理命令・DOCTYPE —— JSON に対応物がなく、破棄して件数を数えます。 · 名前空間 —— 接頭辞はタグ名の一部として保持しますが(`xs:element`)、名前空間の解決は行いません:接頭辞が違えば同じ名前空間でも別のキーになります。 そこでここでは約束を固定して変換し、上のような損失を項目ごとに報告します(コメントが何件、どの要素が混合内容か)—— 完全に見える JSON を黙って出すのではなく。 ⚠️ 根要素は展開しません:`<a><b>1</b></a>` は `{"a":{"b":"1"}}` になり、`{"b":"1"}` にはなりません。展開したほうが綺麗に見えますが、逆方向が成立しなくなります —— `{"b":"1"}` を XML に戻すとき、根要素の名前は何にするのでしょう?その名前は展開の時点で捨てられています。このツールは双方向なので、両方向で 1 つの約束を共有します。すべてブラウザー内で完結します。

機能

  • 双方向:XML → JSON と JSON → XML。明示的に指定もできます
  • ⚠️ この変換で失われたものを報告:コメント・処理命令・DOCTYPE の件数
  • ⚠️ 混合内容(テキストと要素の混在)を検出し、その構造がすでに失われていることを説明
  • ⚠️ この変換が本質的に可逆でない理由と、向き・不向きを末尾に明記
  • 属性は `@名前`、テキストは他にキーがある場合のみ `#text` に
  • 同名の子要素が複数なら配列、1 つなら単一値のまま
  • CDATA はテキストに統合(JSON では区別できません)
  • ⚠️ タグ名と属性名は大文字小文字を区別 —— XML はそういうもので、HTML とは違います
  • ⚠️ 名前空間の接頭辞はそのまま保持し、解決はしない(理由も明記)
  • ⚠️ 逆方向では不正なキー名をスキップして報告し、黙って書き換えません
  • ⚠️ XML は HTML より厳格:タグは閉じる、属性値は引用符必須、未定義実体はエラー —— いずれも位置を示します
  • すべてブラウザー内で完結します

使い方

  1. XML または JSON を貼り付けます。方向は自動判定されます(`<` で始まれば XML)
  2. 約束を確認したい場合は「変換の約束も表示」をオンにします
  3. まず結果を、次に「この変換で失われたもの」を確認します

よくある質問

根要素を展開しないのはなぜですか?
展開すると逆方向が成立しなくなるからです。展開すると `<a><b>1</b></a>` は `{"b":"1"}` になり、根要素の名前 `a` が失われます。戻すとき、その根要素は何という名前になるのでしょう?`<root>` を勝手に作るしかなく、その名前はあなたのデータにはありません。このツールは双方向なので、両方向が 1 つの約束を共有する必要があり、根要素は外側に残します。往復テストはまさにこの点を固定しています:XML を JSON にして戻したとき、意味が同じでなければなりません。
「混合内容」とは何で、なぜ失われるのですか?
1 つの要素の中でテキストと子要素が交互に現れることです:`<p>前<b>太字</b>後</p>`。これは XML として完全に合法で、順序に意味があります(「後」はその `<b>` の後に来なければなりません)。一方 JSON のオブジェクトは順序を持たないキーと値の集まりで、「1 番目と 2 番目の子要素の間にテキスト」という位置を表現できません。したがってテキストは連結され、位置情報は失われます。保つには変換しないか、順序を表現できる形式を使うしかありません。ここでは少なくとも該当する要素の件数を数え、損失の在り処が分かるようにしています。
`&nbsp;` がエラーになるのはなぜですか?
XML が事前定義している実体は `lt`・`gt`・`amp`・`quot`・`apos` の 5 つだけだからです。`&nbsp;` は HTML のもので、XML では未定義の実体であり、それを使った文書は整形式ではありません。寛容に解釈してしまえば、問題のある文書が完全に正常に見え、しかも「動く」結果を手にした人は他のツールが読めない理由を考えません。その文字が欲しければ `&#160;` と書いてください。
XML と HTML の解析はそんなに違うのですか?
大きく違います。HTML は寛容になるよう設計されています:閉じないタグ、引用符のない属性値、大文字小文字の混在 —— ブラウザーは最善を尽くします。XML は厳格になるよう設計されています:タグは対応が必要、属性値は引用符必須、大文字小文字は区別(`<Element>` と `<element>` は別物)、未定義実体はエラーです。したがってブラウザーの HTML パーサーで XML を読むことはできません —— あなたが知る必要のある文書の問題を、黙って直してしまうからです。
どんなときに使い、どんなときに使うべきでないですか?
使うべき:サービス間のデータ移動。API が XML しか返さないがコードは JSON を扱いたい、あるいは XML しか読めない古いシステムに設定を渡したい場合です。使うべきでない:XML 文書の編集。混合内容・コメント・名前空間があれば、往復したあとの文書は元とは別物で、しかも警告は出ません。XML の編集には元の形式を保つツールを使ってください。

関連ツール