用語辞典・データ・文字コード

XML

XMLとは

XML(Extensible Markup Language/エクステンシブル・マークアップ・ランゲージ/エックスエムエル)は、開始タグと終了タグで階層構造を表し、独自の要素名を定義できるテキストデータ形式です。

文書、設定、Office文書の内部、SVG、各種交換形式などの基盤に使われます。HTMLのように決められた表示要素を並べるのではなく、用途ごとの語彙と構造を定義できます。

XMLはタグ名の意味を自動で理解しません。構文を正しく木構造へする役割と、どの要素を許し何を意味するかを定めるスキーマの役割は別です。

一つのルート要素から子要素を入れ子にする整形式・スキーマ・名前空間・外部エンティティーを別に確認する
一つの文書ルートから対応する開始・終了タグの門が階層状に広がり、属性札と内容を持つ流れ、正しい入れ子、スキーマ検証、名前空間、外部サーバーへ向かう危険な実体参照の遮断、混在内容を示すピクトグラム図解
図1同じ見た目のローカル名前でも名前空間URIが違えば別の名前です。スキーマでの妥当性検証は、整形式であることを確認した後に行います。

XML文書を作る主な部品

Element要素

開始タグ、内容、終了タグからなり、子要素を入れ子にできます。

Attribute属性

開始タグへ名前と値を付けます。同じ要素に同名属性を重複できません。

Text文字データ

要素内の本文です。<&はエスケープが必要です。

Other nodesコメントなど

コメント、処理命令(processing instruction)などがありますが、利用可否は上位仕様に従います。

文書要素は一つだけ

<library>
  <book id="b1">
    <title>ネットワーク入門</title>
  </book>
</library>

文書全体を包むdocument element(ドキュメント・エレメント/文書要素)、通称ルート要素は一つです。複数の最上位要素を並べる場合は、それらを包む一つのルートが必要です。

要素名は大小文字を区別します。開始タグと終了タグの名前を一致させ、入れ子を交差させません。空要素は<item/>の形でも表せます。

well-formedと有効は別の判定

well-formed(ウェルフォームド/整形式)は、一つのルート、正しい入れ子、引用符付き属性、禁止文字がないことなど、XMLの基本構文を満たす状態です。違反した文書をXMLプロセッサーは通常の木構造として読み続けません。

valid(バリッド/妥当)は、整形式に加えてDTDやXML Schemaなどのスキーマが定めた要素順、必須項目、型、値域を満たす状態です。スキーマを使わないXMLは、整形式でも「スキーマに対して有効」という判定対象がありません。

名前空間で語彙の衝突を避ける

XML Namespaces(エックスエムエル・ネームスペーシズ/名前空間)は、URIとローカル名前の組で要素・属性名を識別します。異なる仕様がどちらもtitleという名前を使っても、名前空間URIが違えば区別できます。

プレフィックスは文書内の省略名であり、名前そのものではありません。a:titleb:titleが同じ名前空間URIへ結び付けられていれば、同じexpanded name(エクスパンデッド・ネーム/展開名)です。比較や署名でプレフィックス文字列だけを見てはいけません。

属性と子要素の選び方

短い識別情報を属性、繰り返しや階層を持つ内容を子要素へする設計がよくありますが、XML標準が一律の正解を決めているわけではありません。スキーマ、順序、将来拡張を考えて語彙側で統一します。

属性値は順序を持たず、同じ名前を繰り返せません。子要素は順序と複数出現を表せます。利用側が順序を意味として扱うかもスキーマで定めます。

空白と混在コンテンツ

要素の間の改行や字下げも、XML解析器から見れば文字データになり得ます。データ中心のXMLでは空白だけのテキストノードを無視する処理がありますが、文書中心のmixed content(ミックスド・コンテント/混在内容)では語句間の空白が意味を持ちます。

xml:spaceや上位仕様、スキーマのコンテンツモデルを確認し、「読みやすく整形しただけ」と無条件に空白を削除しません。

エンティティーとXXE

XMLにはentity reference(エンティティー・リファレンス/実体参照)があり、定義済みの&lt;などで特別な文字を表せます。パーサーの設定によっては、DTDから外部資源を参照できる場合もあります。

信頼できないXMLで外部エンティティーを許すと、サーバー内ファイルの読み取り、内部ネットワークへの要求、資源の大量消費を招くXXE(XML External Entity/エックスエムエル・エクスターナル・エンティティ)攻撃につながります。外部DTD・外部エンティティー・ネットワークアクセスを無効にした安全なパーサー設定を使い、入力サイズと展開量も制限します。

文字エンコーディング宣言

XMLはUnicode文字を扱い、外部の実体ではUTF-8とUTF-16を必ず扱えることが基本です。先頭のXML declarationでencoding="UTF-8"などを示せます。HTTPで運ぶ場合はMIMEタイプと文字集合の規則も関わります。

宣言と実際のバイトが違えば致命的なエラーになります。文字化けした状態を推測して読み続けず、生成側で宣言と保存を一致させます。

XMLは一つのルートから要素を正しく入れ子にするテキスト形式です。整形式とスキーマ妥当性、ローカル名と名前空間、本文中の空白と整形用の空白、内部エンティティーと外部エンティティーを分けて扱います。

XML 1.0の構文・整形式・妥当性・encoding:W3C Extensible Markup Language 1.0/名前空間:Namespaces in XML

関連用語