XMLの混合コンテンツとJSON表現

要素がテキストと子要素の両方を含むXMLの混合コンテンツを理解します。JSONでの混合コンテンツ表現の課題と一般的なアプローチを解説します。

Advanced

詳細な説明

混合コンテンツは、要素がテキストと子要素を交互に含むXMLの機能です。ドキュメント指向のXML(HTML、DocBook、XHTML)では一般的ですが、自然なJSON表現がありません。

混合コンテンツを持つXML:

<paragraph>
  This is <bold>important</bold> text with a
  <link href="https://example.com">hyperlink</link> inside it.
</paragraph>

ここで <paragraph> 要素は以下を含みます:

  1. テキストノード:"This is "
  2. 要素:<bold>important</bold>
  3. テキストノード:" text with a\n "
  4. 要素:<link>
  5. テキストノード:" inside it."

JSON表現の課題:

JSONでこれを表現する標準的な方法はありません。一般的なアプローチ:

アプローチ1:すべてのテキストを連結(非可逆)

{ "paragraph": "This is important text with a hyperlink inside it." }

これは要素構造を完全に失います。

アプローチ2:特殊な #text キーを使用

{
  "paragraph": {
    "#text": ["This is ", " text with a\n  ", " inside it."],
    "bold": "important",
    "link": { "@href": "https://example.com", "#text": "hyperlink" }
  }
}

構造は保持しますが、テキストと要素のインターリーブ順序は失われます。

アプローチ3:順序付きトークン配列(JsonML風)

["paragraph", "This is ", ["bold", "important"], " text with a\n  ",
  ["link", {"href": "https://example.com"}, "hyperlink"], " inside it."]

構造と順序の両方を保持しますが、クエリしにくいJSONになります。

実用的なガイダンス:

  • データ指向XML(設定、APIレスポンス)を変換する場合、混合コンテンツはまれなので、シンプルなキーバリューアプローチが使えます。
  • ドキュメント指向XML(HTML、出版フォーマット)を変換する場合、混合コンテンツが標準なので、順序付き表現が必要です。

ユースケース

コンテンツ管理システムのリッチテキストXHTMLコンテンツをパースし、段落テキスト内のインラインフォーマットタグを保持しながらReactコンポーネントがレンダリングできるJSON構造に変換する場合。

試してみる — JSON ↔ XML Converter

フルツールを開く