JSON を XML に変換するのは、可逆ではないマッピングの逆操作です。つまり、JSON では強制されなかった選択を迫られます:ルート要素は何か?このキーは属性になるのか、子要素になるのか?JSON 配列はどう繰り返し XML タグになるのか?本ガイドでは JavaScript、Python、ブラウザで JSON を XML に変換する慣例 —— ルート要素、配列、属性、エスケープ —— を扱います。
ルート要素を選ぶ
XML はルート要素をちょうど 1 つ要求しますが、JSON にそのようなルールはありません。最初の決断は、すべてを何で包むかです。JSON が単一のトップレベルキーを持つオブジェクトなら、そのキーが自然なルートになります:
{ "note": { "to": "Ada", "from": "Bob" } }
<note>
<to>Ada</to>
<from>Bob</from>
</note>JSON に複数のトップレベルキーがある(または配列の)場合、単一のルートが存在しないため、コンバータはすべてを合成要素で包みます。例えば <root>:
{ "to": "Ada", "from": "Bob" }
<root>
<to>Ada</to>
<from>Bob</from>
</root>@ プレフィックスキー → 属性
XML から JSON への慣例とラウンドトリップさせるため、@ で始まるキーは子要素ではなく属性として出力され、#text キーはその要素のテキストコンテンツになります:
{
"price": { "@currency": "USD", "#text": "9.99" }
}
<price currency="USD">9.99</price>この慣例を使わない場合、すべての値が子要素になります —— 妥当ですが冗長です。この @/#text 慣例こそが、XML → JSON → XML の無損ラウンドトリップを可能にします。
配列は要素の繰り返しになる
JSON 配列は複数の値を持つ単一要素にはなりません —— 同じ要素が繰り返される 形になります。XML がリストをそう表現するためです:
{ "tags": { "tag": ["a", "b", "c"] } }
<tags>
<tag>a</tag>
<tag>b</tag>
<tag>c</tag>
</tags>微妙な帰結として:トップレベルのオブジェクト配列はルートになれません(複数のルート要素を生んでしまいます)。包む必要があり、典型的には <root> で繰り返しの <item> 要素を囲みます。
綺麗にマッピングできない値
- 真偽値と数値 —— XML には型がないので、
trueと42はテキストのtrueと42として書かれます。 - null —— 通常は空/自己閉じ要素:
<middleName/>。 - 妥当な要素名でないキー —— 名前は数字で始まったり空白を含んだりできません。
"1st place"は妥当なタグではないので、サニタイズしないと不正な XML になります。
エスケープと宣言
テキストと属性値は &、<、>(属性内では加えて ")をエスケープしなければなりません。コンバータは出力が完全な文書になるよう XML 宣言も先頭に付けるべきです:
<?xml version="1.0" encoding="UTF-8"?>
<message>B & C are < D</message>XSD を対象にする、または xmlns を出力する
受け側が XML を XSD(XML Schema)に対して検証する場合、キー→要素マッピングの他にもいくつか追加の作業が必要です:
- 要素の順序が重要。 XML の要素属性は(仕様上)順序を持ちませんが、子要素は順序付きで、多くの XSD は
xsd:sequenceで順序を強制します。子要素はオブジェクトキーの走査順ではなく、スキーマが期待する順序で出力してください。さもないと検証に失敗します。 - 名前空間のマッピング。
xmlns宣言をルートの@xmlns属性として再現し、プレフィックス付きの名前を XML に反映してください("soap:Envelope"⇒<soap:Envelope>)。名前空間を落とすコンバータは、それを要求する XSD では検証に通らない XML を作ります。 - 型を意識した値。 XML にはネイティブな型がないので、
xsd:intやxsd:date付きの XSD はテキ ストコンテンツが一致するかをチェックするだけです。JSON 値を XSD のパターンが期待するテキスト(ISO 日付、整数文字列など)にフォーマットしてください。
コードで JSON を XML に変換
// JavaScript —— 小さな再帰ビルダ、またはライブラリ:
import { XMLBuilder } from 'fast-xml-parser';
const builder = new XMLBuilder({ ignoreAttributes: false, attributeNamePrefix: '@' });
const xml = builder.build(jsonObject);
# Python —— dicttoxml、あるいは xml.etree.ElementTree で自作
from dicttoxml import dicttoxml
xml_bytes = dicttoxml({"note": {"to": "Ada"}}, attr_type=False)JSON をオンラインで XML に変換
JSON を JSON ⇄ XML コンバータ に貼り付けて To XML をクリックしてください。妥当なルートを選び、@ キーを属性に、配列を繰り返し要素に、特殊文字をエスケープします —— すべてブラウザで動作します。JSON に構文エラーがあれば先に修復が試みられます;JSON Fix で事前にクリーンアップすることもできます。
よくある質問
JSON を XML に変換するには?
ルート要素を 1 つ選び(単一トップレベルキー、または合成の <root>)、再帰的にキーを子要素に、@-プレフィックスキーを属性に、配列を繰り返し要素にします —— テキスト内の &、<、> をエスケープしてください。
JSON 配列は XML でどうなりますか?
各配列項目は同名タグの独立した要素になります。XML はリストを単一の複数値ノードではなく要素の繰り返しで表現するためです。
JSON の値を XML の属性にするには?
キーに @ のプレフィックスを付けます(例:"@id")。要素のテキストは #text 配下に置きます。これは標準的な XML → JSON 慣例と一致するため、変換はラウンドトリップします。
JSON キーが妥当な XML 要素名でない場合は?
XML タグ名は数字で始められず、空白を含めないため、"1st place" のようなキーはサニタイズする必要があります(例:_1st_place)。さもないと整形式の XML になりません。
関連ツールとガイド
- JSON ⇄ XML コンバータ —— ブラウザで両方向に変換
- XML から JSON への変換:属性、テキストノード、配列、名前空間 —— 逆方向
- CSV と XML を JSON に変換する方法
- JSON とは? —— 対象フォーマットの型と規則