XML → JSON 変換ツール
XML → JSON変換とは?
XML → JSON変換は、XML(Extensible Markup Language)データをJSON(JavaScript Object Notation)形式に変換するプロセスです。レガシーシステムの近代化、JSONを期待するREST APIとの連携、よりコンパクトで解析しやすいデータ形式が必要な場合に便利です。 属性、名前空間、同名ノード、空要素、テキスト混在の扱いによって結果の形が変わるため、API 連携や移行作業ではサンプルだけでなく例外的なデータも確認する必要があります。
使い方
使い方
- 左の入力ボックスにXMLデータを貼り付けるか入力します
- インデントサイズを選択します(2スペース、4スペース、またはタブ)
- 変換されたJSONは右側にシンタックスハイライト付きで表示されます
- 変換結果を確認し、XMLエラーがあれば修正します
- 「コピー」または「ダウンロード」をクリックして結果を保存します
データ形状に関する注意
- XML属性、繰り返しノード、名前空間、混合テキストはJSONに複数の有効な方法でマッピングできます。使用する前に生成された構造を確認してください。
- API移行の場合は、1つのサンプル変換に頼るのではなく、フィールドマッピングルールを定義してください。
利用シーン
仕組み
変換はブラウザの組み込みXMLパーサーから始まります。`new DOMParser().parseFromString(xmlString, 'application/xml')`はW3C DOM Level 3 Coreに従い、XML 1.0(第5版)に対して整形式性を検証し、`Element`、`Attr`、`Text`、`CDATASection`、`Comment`ノードのツリーとして結果を公開する`Document`を返します。入力が不正な場合、パーサーはスローしません。代わりに位置と理由を含む`<parsererror>`をルート要素とするドキュメントを返すため、コンバーターはまず`doc.querySelector('parsererror')`をチェックし、部分的なJSONを生成する代わりにそのメッセージを表示します。 ツリーからJSONへのマッピングはドキュメントを深さ優先で巡回し、Badgerfishスタイルの規約に従います。各要素はローカル名をキーとするプロパティになり、子要素はネストされたオブジェクトになり、要素属性は`@`プレフィックスでフラット化されます(例:`<user id="7">` → `{ "user": { "@id": "7" } }`)。子要素と並ぶテキストコンテンツは`#text`に格納されます。同じ名前の兄弟要素の繰り返しはJSON配列にまとめられます。2つの`<item>`ノードは`"item": [ ... ]`になりますが、単一の`<item>`はプレーンオブジェクトのままです。これは「単一 vs 複数」の有名な曖昧さであり、XMLは1要素のリストとスカラ値を区別できないのに対し、JSONは`"item": {...}`と`"item": [{...}]`を異なる形状として扱います。 XMLのいくつかの機能にはJSONでの対等な表現がなく、意図的に非可逆です。XMLは要素の順序を保持しますが、すべてのコンシューマーがJSONオブジェクトのキー順序を保証するわけではありません(ES2015は文字列キーの挿入順序を規定していますが、JSON Schemaのようなスキーマはそれを制約しません)。`<p>Hello <b>world</b>!</p>`のような混合コンテンツはテキストと要素が交互に入り、単純なキーバリューモデルにラウンドトリップできません。Clark記法の名前空間(`{http://example.com/ns}user`)はローカル名`user`に縮小され、同じ名前の名前空間なし要素と衝突する可能性があります。CDATAブロック(`<![CDATA[<raw>]]>`)はプレーンテキストに展開されます。処理命令(`<?xml-stylesheet ...?>`)、コメント(`<!-- ... -->`)、XML宣言はJSONに構文がないため破棄されます。インデントは`JSON.stringify(value, null, indent)`で2スペース、4スペース、または`'\t'`を指定して適用されます。
- パーサー:W3C DOM Level 3 Coreに従う`new DOMParser().parseFromString(xml, 'application/xml')`。エラーはスローされた例外ではなく、`<parsererror>`ルート要素として表面化します。
- マッピング規約:Badgerfishスタイルでは属性に`@attr`、混合テキストに`#text`、子要素にローカル名を使用。Parkerは属性を削除、Sparkは`$`に保持します。
- 同じ名前の繰り返し子要素はJSON配列にまとめられます。単一の子要素はオブジェクトのままです。この「単一 vs 複数」の曖昧さにはXML側の修正策がありません。
- 非可逆な機能:属性(`@`プレフィックスなし)、名前空間(`xmlns:foo`)、処理命令、コメント、XML宣言、CDATAラッパー。
- 混合コンテンツ(`<p>Hello <b>world</b>!</p>`)はキーバリューJSONにラウンドトリップできません。要素順序はキー順序を保持しないコンシューマー間で失われる場合があります。
- 数値/ブール値への型変換は意図的な選択です。`<age>30</age>`は`30`(数値)または`"30"`(文字列)になります。先行ゼロ(`007`)は文字列として保持すべきです。
- 出力フォーマットは`JSON.stringify(value, null, indent)`を使用し、インデントは2スペース、4スペース、または`'\t'`です。結果はBOMなしUTF-8です。
使用例
シンプルな要素
<root>
<name>John</name>
</root>
→
{"root": {"name": "John"}}繰り返し要素
<root>
<item>A</item>
<item>B</item>
</root>
→
{"root": {"item": ["A", "B"]}}ネスト構造
<root>
<user>
<name>John</name>
<age>30</age>
</user>
</root>
→
{"root": {"user": {"name": "John", "age": 30}}}よくある質問
XML 要素はどのように JSON にマッピングされますか?
各要素はその要素の内容(文字列またはネストされたオブジェクト)を値として持つ JSON プロパティになります。同じ名前を持つ繰り返し要素は配列になります。属性は通常、'@' で接頭辞を付けるか、'$' のような特別なキーに格納されます。具体的な変換規則はページごとに異なり、設定可能です。
XML から JSON への変換が情報損失を伴うのはなぜですか?
XML は要素、属性、テキストコンテンツ、混合コンテンツ(テキストと要素)、名前空間、処理命令、コメントを区別します。JSON にはオブジェクト、配列、文字列、数値、真偽値、null しかありません。より豊かな XML ツリーを JSON にマッピングすると、順序や要素 vs 属性の区別といった情報が失われます。
混合コンテンツ要素(テキスト + 子要素)はどう扱われますか?
Hello world!
にはきれいな JSON 表現がありません。本ページでは通常、特別なキー(例: '#text' や '$')を使って自由なテキストを取り込みますが、テキストと要素の順序が常に保持されるわけではありません。ラウンドトリップが必要な場合は混合コンテンツを避けてください。XML 名前空間はどう扱われますか?
接頭辞付き要素(<ns:foo>)は文字列キー 'ns:foo' になるか、ns/ローカル名のプロパティに分割されます。xmlns 宣言は属性のようなプロパティとして保持されたり破棄されたりし、ページの設定によって異なります。
JSON から元と同じ XML に戻せますか?
ラウンドトリップは一般に可逆ではなく、特に混合コンテンツ、コメント、処理命令、属性順序については情報が失われます。データのみの XML(設定、シンプルなレコード)であれば、通常はラウンドトリップが機能します。ドキュメント形式の XML(DocBook、HTML、RSS)には本物の XML パーサーを使ってください。
空の XML 要素 <foo/> は <foo></foo> と同じですか?
パーサーにとっては同じです。どちらも空文字列または null 値を持つプロパティ foo を生成します。自己終了構文は XML では純粋に見た目の問題です。
変換はローカルで行われますか?
はい。XML のパースと JSON の生成はブラウザ内で行われます。本ページはデータをアップロードしません。