ToolActToolAct

XML → JSON 変換ツール

XML入力
JSON出力
行数: 1文字数: 0バイト数: 0
行数: 1文字数: 0バイト数: 0

XML → JSON変換とは?

XML → JSON変換は、XML(Extensible Markup Language)データをJSON(JavaScript Object Notation)形式に変換するプロセスです。レガシーシステムの近代化、JSONを期待するREST APIとの連携、よりコンパクトで解析しやすいデータ形式が必要な場合に便利です。 属性、名前空間、同名ノード、空要素、テキスト混在の扱いによって結果の形が変わるため、API 連携や移行作業ではサンプルだけでなく例外的なデータも確認する必要があります。

使い方

使い方

  1. 左の入力ボックスにXMLデータを貼り付けるか入力します
  2. インデントサイズを選択します(2スペース、4スペース、またはタブ)
  3. 変換されたJSONは右側にシンタックスハイライト付きで表示されます
  4. 変換結果を確認し、XMLエラーがあれば修正します
  5. 「コピー」または「ダウンロード」をクリックして結果を保存します

データ形状に関する注意

  • XML属性、繰り返しノード、名前空間、混合テキストはJSONに複数の有効な方法でマッピングできます。使用する前に生成された構造を確認してください。
  • API移行の場合は、1つのサンプル変換に頼るのではなく、フィールドマッピングルールを定義してください。

利用シーン

XMLペイロードを確認しやすいJSONに変換SOAP、RSS、デバイス、取引先のXMLを貼り付けると、ブラウザのDOMParserがドキュメントをJSONオブジェクトに変換します。ルート要素を保持し、子要素をネストし、同名の兄弟要素を配列にまとめます。数値テキストやtrue/falseは判別しやすいものに限り変換対象になります。パーサーはW3C DOM Level 3 Core仕様に準拠するため、DOMParserが受け付ける整形式XML 1.0入力はすべて走査可能なツリーを生成し、JSONへの変換ではそのツリーを深さ優先で巡回し、兄弟の重複数を数えて単一オブジェクトとJSON配列を切り替えます。
XML連携の置き換え前にサンプルデータを準備2画面エディターで元のXMLとフォーマットされたJSONを並べて比較し、output.jsonをコピーまたはダウンロードして移行メモ・テストデータ・APIの議論に活用できます。インデントは2スペース・4スペース・タブから選択でき、利用側のコードベースに合わせられます。
パース処理の多いワークフローに入る前に不正XMLを検出変換ツールはブラウザのXMLパーサーからのパースエラーを表示し、無言で部分的な出力を作ることはしません。要素とテキストコンテンツに焦点を当てているため、属性・名前空間・コメント・処理命令・スキーマ検証が必要な場合は専用のXMLツールで別途確認してください。
属性をJSONキーにどう変換するか確認要素が属性と子要素を混在させる場合、属性には通常@プレフィックスが付き、テキストコンテンツや名前付き子要素との衝突を避けます。生成されたJSONの@idや@typeのようなフィールドを確認し、フラットなキー構造が好ましい場合は利用側のコードでリネームしてください。慣例的なマッピングではXML属性は`@attribute`、子要素と並ぶテキストデータは`#text`、各子要素はローカル名そのものとなり、多くのJSON-XMLライブラリで使われているBadgerfish規約に倣います。
変換ツールが意図的に簡略化するXMLを見分ける属性・名前空間・処理命令・コメント・CDATAブロックに依存するドキュメントは、JSON出力で詳細が失われます。それらのXML機能にビジネスデータが含まれている場合は、結果を読みやすい簡易ビューとして扱い、完全な移行先としてはください。配列検出は同名の兄弟子要素にのみ発動するため、単一の`<item>`と2つの`<product>`兄弟は2つのキーを持つオブジェクトにまとめられ、リストにはなりません。Clark記法の名前空間`{http://example.com/ns}user`はローカル名`user`から切り捨てられるため、同じ名前の名前空間なし要素と衝突する可能性があります。

仕組み

変換はブラウザの組み込み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です。

使用例

シンプルな要素

&lt;root>
  &lt;name>John&lt;/name>
&lt;/root>
→
{"root": {"name": "John"}}

繰り返し要素

&lt;root>
  &lt;item>A&lt;/item>
  &lt;item>B&lt;/item>
&lt;/root>
→
{"root": {"item": ["A", "B"]}}

ネスト構造

&lt;root>
  &lt;user>
    &lt;name>John&lt;/name>
    &lt;age>30&lt;/age>
  &lt;/user>
&lt;/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 の生成はブラウザ内で行われます。本ページはデータをアップロードしません。