XML名前空間とJSON変換
XML名前空間の仕組みとJSONでの表現方法を理解します。名前空間プレフィックス、デフォルト名前空間、名前空間情報を保持するための戦略を解説します。
XML Features
詳細な説明
XML名前空間は、異なるボキャブラリのドキュメントを組み合わせる際の要素名の衝突を防ぎます。JSONには直接的な等価物がないため、XML-JSON変換で最も難しい側面の一つです。
名前空間を持つXML:
<order xmlns="http://example.com/orders"
xmlns:pay="http://example.com/payments">
<id>ORD-001</id>
<total>99.99</total>
<pay:method>credit_card</pay:method>
<pay:status>completed</pay:status>
</order>
JSON表現の戦略:
戦略1:プレフィックスの保持
{
"order": {
"@xmlns": "http://example.com/orders",
"@xmlns:pay": "http://example.com/payments",
"id": "ORD-001",
"total": "99.99",
"pay:method": "credit_card",
"pay:status": "completed"
}
}
戦略2:名前空間の除去(非可逆だがシンプル)
{
"order": {
"id": "ORD-001",
"total": "99.99",
"method": "credit_card",
"status": "completed"
}
}
戦略3:Clark記法(曖昧さなし)
{
"{http://example.com/orders}order": {
"{http://example.com/orders}id": "ORD-001",
"{http://example.com/payments}method": "credit_card"
}
}
XMLでの名前空間の仕組み:
xmlns="..."はデフォルト名前空間を宣言します。修飾されていないすべての要素がこの名前空間に属します。xmlns:prefix="..."はプレフィックス付き名前空間を宣言します。要素はプレフィックス(pay:method)で名前空間を示します。- 名前空間は継承される。 子要素はオーバーライドされない限り、親からデフォルト名前空間を継承します。
変換の実用的なアドバイス:
- 両端を制御できる場合、規約を合意して文書化してください。
- SOAP/WSDLとの相互運用では、受信側サービスがバリデーションするため名前空間プレフィックスを保持してください。
- データ抽出のみ(ラウンドトリップ不要)の場合、クリーンなJSONのために名前空間を除去してください。
ユースケース
エンベロープ、ボディ、カスタム型など異なるスキーマコンポーネントに複数のXML名前空間を使用するSOAP APIレスポンスをパースし、TypeScriptミドルウェアレイヤー用の名前空間対応JSONに変換する場合。