← 記事一覧

JSON を XML へ: ルート要素、配列、属性マッピング

JSON を XML に変換: ルート要素を選ぶ、@ プレフィックスのキーを属性に対応させる、配列を繰り返し要素にする、エスケープ —— JS、Python、オンラインで。

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 には型がないので、true42 はテキストの true42 として書かれます。
  • null —— 通常は空/自己閉じ要素:<middleName/>
  • 妥当な要素名でないキー —— 名前は数字で始まったり空白を含んだりできません。"1st place" は妥当なタグではないので、サニタイズしないと不正な XML になります。

エスケープと宣言

テキストと属性値は &<>(属性内では加えて ")をエスケープしなければなりません。コンバータは出力が完全な文書になるよう XML 宣言も先頭に付けるべきです:

<?xml version="1.0" encoding="UTF-8"?>
<message>B &amp; C are &lt; D</message>

XSD を対象にする、または xmlns を出力する

受け側が XML を XSD(XML Schema)に対して検証する場合、キー→要素マッピングの他にもいくつか追加の作業が必要です:

  • 要素の順序が重要。 XML の要素属性は(仕様上)順序を持ちませんが、子要素は順序付きで、多くの XSD は xsd:sequence で順序を強制します。子要素はオブジェクトキーの走査順ではなく、スキーマが期待する順序で出力してください。さもないと検証に失敗します。
  • 名前空間のマッピング。 xmlns 宣言をルートの @xmlns 属性として再現し、プレフィックス付きの名前を XML に反映してください("soap:Envelope"<soap:Envelope>)。名前空間を落とすコンバータは、それを要求する XSD では検証に通らない XML を作ります。
  • 型を意識した値。 XML にはネイティブな型がないので、 xsd:intxsd: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 になりません。

関連ツールとガイド