ToolDeck

XMLからJSON変換ツール

XMLをJSON形式に変換

サンプルを試す

XML入力

JSON出力

ローカルで実行 · シークレットの貼り付けも安全
JSONはここに表示されます…

XMLからJSONへの変換とは?

XMLからJSONへの変換とは、Extensible Markup Language(XML)のデータをJavaScript Object Notation(JSON)に変換するプロセスです。どちらの形式も構造化された階層データを表しますが、異なる構文とデータモデルを使用します。XMLは任意の属性を持つ開始タグと終了タグを使用し、JSONはキーと値のペア、配列、プリミティブ型を使用します。XMLをJSONに変換することで、JavaScriptランタイム、REST API、NoSQLデータベースなど、JSONがネイティブ形式である環境でXMLデータを扱えるようになります。

変換が常に1対1になるわけではありません。XMLにはJSONに直接対応するものがない構造があります:属性、混在コンテンツ(テキストと子要素が混在)、処理命令、コメント、CDATAセクション、名前空間宣言などです。変換ライブラリによってこれらの構造の扱い方が異なるため、複数の変換規約が存在します。最も一般的なアプローチは、属性名に@プレフィックスを付け、同じ要素に属性が存在する場合はテキストコンテンツを#textフィールドに格納します。

XMLからJSONへの変換は、SOAPからRESTへの移行、レガシーエンタープライズAPIの利用、またはXMLを義務付ける政府や金融のデータフィードを処理する際によく行われるステップです。プロデューサーとコンシューマーを同時に書き換えるのではなく、チームは境界レイヤーでXMLペイロードを変換し、JSONをダウンストリームに渡します。AWS API Gateway、Apache Camel、MuleSoftはすべてこのパターンをネイティブでサポートしています。

XML input
<bookstore>
  <book category="fiction">
    <title lang="en">The Great Gatsby</title>
    <author>F. Scott Fitzgerald</author>
    <year>1925</year>
    <price>10.99</price>
  </book>
  <book category="non-fiction">
    <title lang="en">Sapiens</title>
    <author>Yuval Noah Harari</author>
    <year>2011</year>
    <price>14.99</price>
  </book>
</bookstore>
JSON output
{
  "bookstore": {
    "book": [
      {
        "@category": "fiction",
        "title": {
          "@lang": "en",
          "#text": "The Great Gatsby"
        },
        "author": "F. Scott Fitzgerald",
        "year": "1925",
        "price": "10.99"
      },
      {
        "@category": "non-fiction",
        "title": {
          "@lang": "en",
          "#text": "Sapiens"
        },
        "author": "Yuval Noah Harari",
        "year": "2011",
        "price": "14.99"
      }
    ]
  }
}

オンラインXMLからJSON変換ツールを使う理由

XMLに属性、名前空間、または配列にする必要がある繰り返し要素が含まれている場合、一回限りの変換スクリプトを書くのは時間がかかります。ブラウザベースの変換ツールなら数秒でJSON出力が得られるため、構造を確認してすぐに次の作業に進めます。

即時変換
XMLを貼り付けるとすぐにJSON出力が得られます。ライブラリのインストール、スクリプトの作成、ビルドツールの設定は不要です。
🔒
プライバシー優先の処理
変換処理はすべてJavaScriptを使用してブラウザ内で実行されます。XMLデータがマシンの外に出ることはなく、いかなるサーバーにもアップロードされません。
🔀
属性と配列に対応
属性は@プレフィックス付きキーにマッピングされます。繰り返しの兄弟要素はParkerまたはBadgerFish規約に従って自動的にJSON配列にグループ化されます。
📋
アカウント不要
ページを開いてXMLを貼り付け、JSON結果をコピーするだけです。サインアップ、APIキー、使用制限は一切ありません。

XMLからJSON変換の使用例

フロントエンド開発
XML APIのレスポンスをJSONに変換することで、クライアントバンドルにXMLパースライブラリを追加せずに、React、Vue、Angularコンポーネントでデータをレンダリングできます。
バックエンドエンジニアリング
SOAPペイロード、RSS/AtomフィードまたはXML-RPCレスポンスをAPIゲートウェイ層でJSONに変換し、JSON入力を期待するマイクロサービスにデータを渡します。
DevOpsとCI/CD
XMLテストレポート(JUnit、NUnit、xUnit)をJSONに変換して、ダッシュボード、Slackボット、カスタムCI通知パイプラインに取り込みます。
QAとテスト
変換されたJSONスナップショットを期待される出力と比較して、XMLを生成するサービスがリリース間でレスポンス構造を変えていないか検証します。
データエンジニアリング
政府ポータル、金融フィード(FIX、FIXML)、医療システム(HL7 CDA)からのXMLエクスポートをJSONに変換して、BigQuery、Snowflake、Elasticsearchに読み込みます。
データ形式の学習
データ交換形式を学ぶ学生は、XMLサンプルを変換ツールに貼り付けることで、要素、属性、ネストがJSONのキー、オブジェクト、配列にどのようにマッピングされるかを具体的に確認できます。

XMLからJSONへのマッピング早見表

XMLとJSONは異なるデータモデルを持ちます。以下の表は、最も一般的な規約(属性に@、属性と共存するテキストに#text)に基づいて、各XML構造がJSONの等価表現にどのようにマッピングされるかを示しています。混在コンテンツやコメントなど一部の構造には標準的なJSON表現がありません。

XML構造XMLの例JSONの等価表現
Element<name>text</name>"name": "text"
Nested elements<a><b>1</b></a>"a": { "b": "1" }
Attributes<el attr="v"/>"el": { "@attr": "v" }
Text + attributes<el a="1">text</el>"el": { "@a": "1", "#text": "text" }
Repeated elements<r><i>1</i><i>2</i></r>"r": { "i": ["1", "2"] }
Mixed content<p>A <b>B</b> C</p>Varies by convention
CDATA<![CDATA[raw]]>"#cdata": "raw" or flattened
Namespacesxmlns:prefix="uri"Prefix preserved or stripped
Empty element<el/>"el": null or ""
Comments<!-- note -->Discarded (no JSON equivalent)

XMLからJSONへの変換規約の比較

XMLからJSONへのマッピングを定める単一の標準はありません。属性の扱い、配列の検出、テキストの保持においてそれぞれトレードオフがある3つの規約が広く使用されています。

BadgerFish
すべてのテキストノードは$キーに格納されます。属性には@プレフィックスが付きます。名前空間は@xmlnsエントリとして保持されます。冗長ですがロスレスで、データを失わずにXMLに逆変換できます。
Parker
属性を完全に除去し、テキストのみの要素をそのままの値に変換します。繰り返し要素は配列になります。コンパクトで明快ですが破壊的で、属性と名前空間情報は破棄されます。
GData(Google Data)
テキストコンテンツには$tを使用し、属性はプレフィックスなしのトップレベルキーとして保持します。BadgerFishの冗長さとParkerのシンプルさの中間です。歴史的にGoogle APIで使用されていました。

コード例

以下はJavaScript、Python、Go、コマンドラインでXMLをJSONに変換する実用的な例です。各例はネストされた要素と繰り返しの兄弟タグを扱います。

JavaScript (browser)
// Using the DOMParser API to walk XML and build a JSON object
function xmlToJson(xml) {
  const parser = new DOMParser()
  const doc = parser.parseFromString(xml, 'application/xml')

  function nodeToObj(node) {
    const obj = {}
    // Handle attributes
    if (node.attributes) {
      for (const attr of node.attributes) {
        obj['@' + attr.name] = attr.value
      }
    }
    // Handle child nodes
    for (const child of node.childNodes) {
      if (child.nodeType === 3) { // text
        const text = child.textContent.trim()
        if (text) obj['#text'] = text
      } else if (child.nodeType === 1) { // element
        const key = child.nodeName
        const val = nodeToObj(child)
        if (obj[key]) {
          if (!Array.isArray(obj[key])) obj[key] = [obj[key]]
          obj[key].push(val)
        } else {
          obj[key] = val
        }
      }
    }
    // Simplify text-only nodes
    const keys = Object.keys(obj)
    if (keys.length === 1 && keys[0] === '#text') return obj['#text']
    return obj
  }

  return nodeToObj(doc.documentElement)
}

const xml = '<user><name>Alice</name><role>admin</role></user>'
console.log(JSON.stringify(xmlToJson(xml), null, 2))
// → { "name": "Alice", "role": "admin" }
Python
import xmltodict
import json

xml = """
<user>
  <name>Alice</name>
  <roles>
    <role>admin</role>
    <role>editor</role>
  </roles>
</user>
"""

# xmltodict converts XML to an OrderedDict
result = xmltodict.parse(xml)
print(json.dumps(result, indent=2))
# → {
# →   "user": {
# →     "name": "Alice",
# →     "roles": { "role": ["admin", "editor"] }
# →   }
# → }

# With the standard library (xml.etree.ElementTree)
import xml.etree.ElementTree as ET

def etree_to_dict(elem):
    d = {}
    if elem.attrib:
        d.update({f"@{k}": v for k, v in elem.attrib.items()})
    for child in elem:
        child_data = etree_to_dict(child)
        if child.tag in d:
            if not isinstance(d[child.tag], list):
                d[child.tag] = [d[child.tag]]
            d[child.tag].append(child_data)
        else:
            d[child.tag] = child_data
    if elem.text and elem.text.strip():
        if d:
            d["#text"] = elem.text.strip()
        else:
            return elem.text.strip()
    return d

root = ET.fromstring(xml)
print(json.dumps(etree_to_dict(root), indent=2))
Go
package main

import (
    "encoding/json"
    "encoding/xml"
    "fmt"
    "strings"
)

// For simple, known schemas — define a struct
type User struct {
    XMLName xml.Name `xml:"user"`
    Name    string   `xml:"name"`
    Roles   []string `xml:"roles>role"`
}

func main() {
    data := `<user><name>Alice</name><roles><role>admin</role><role>editor</role></roles></user>`
    var user User
    xml.NewDecoder(strings.NewReader(data)).Decode(&user)

    out, _ := json.MarshalIndent(user, "", "  ")
    fmt.Println(string(out))
    // → { "Name": "Alice", "Roles": ["admin", "editor"] }
}
CLI (xmllint + jq / yq)
# Using xq (part of yq, a jq wrapper for XML)
# Install: pip install yq  OR  brew install yq
echo '<user><name>Alice</name></user>' | xq .
# → { "user": { "name": "Alice" } }

# Using xmlstarlet + jq
xmlstarlet sel -t -v '//name' input.xml | jq -R '{ name: . }'

# Node.js one-liner with xml2js
echo '<a><b>1</b></a>' | node -e "
  const {parseString} = require('xml2js');
  let d=''; process.stdin.on('data',c=>d+=c);
  process.stdin.on('end',()=>parseString(d,(e,r)=>console.log(JSON.stringify(r,null,2))))
"

よくある質問

XMLからJSONへの変換はロスレスですか?
必ずしもそうとは限りません。XML属性、コメント、処理命令、名前空間宣言にはJSONの直接対応物がありません。ほとんどの変換ツールは@プレフィックス規約を使用して属性を保持しますが、コメントと処理命令は破棄されます。完全に逆変換可能な形式が必要な場合は、BadgerFishのようなロスレス規約を使用してください。
XML属性はJSONでどのように表現されますか?
最も一般的なアプローチは属性名に@プレフィックスを付けることです。例えば、<book id="1">は{"@id": "1"}になります。一部の変換ツールは代わりにネストされた"_attributes"オブジェクトを使用します。具体的な規約は使用するライブラリによって異なります。
変換ツールは繰り返しXML要素をどのように扱いますか?
同じ親の下に要素が複数回現れる場合、変換ツールはそれらをJSON配列にグループ化します。例えば、2つのitem兄弟要素は{"item": ["a", "b"]}になります。force-arrayモードが有効でない限り、単一のitem要素はそのままの文字列値として残ります。
JSONをXMLに逆変換できますか?
可能ですが、結果は元の変換で使用した規約によって異なります。@プレフィックスで属性が保持されていれば、JSONからXMLへの変換ツールでそれらを再構築できます。元の変換がParker(属性を破棄)を使用した場合、その情報は失われています。ToolDeckには逆方向のJSON to XMLツールもあります。
変換中にXML名前空間はどうなりますか?
名前空間の扱いはライブラリによって異なります。一部の変換ツールはキー名にプレフィックスを保持し(例:"ns:element")、別のものはxmlns宣言を独立したフィールドにマッピングし、完全に名前空間を除去するものもあります。特定のXMLについて名前空間の挙動を確認するには出力を検証してください。
XMLからJSONへの変換に標準はありますか?
W3CやIETFの正式な標準はありません。最も近い参考資料はBadgerFish規約、Parker規約、OASIS XSLT-to-JSONマッピングです。実際には各ライブラリが独自のルールを実装しているため、同じXMLが異なるツールで若干異なるJSONを生成することがあります。
大きなXMLファイルはどうすればいいですか?
ブラウザベースの変換ツールは数メガバイトまでのファイルでは十分に動作します。より大きなファイル(10MB以上)には、PythonのiterparseやNode.jsのxml-streamのようなストリームパーサーを使用してください。これらはツリー全体をメモリに読み込まずにドキュメントを逐次処理します。