C#アプリ(.NETアプリ)におけるGUIはXMLに準拠したマークアップ言語であるXAMLを使って構築していくことができます。ここではXAMLの理解のために、そのベースとなるXMLの基本的な文法について説明します。
XMLについて
マークアップ言語とXML
XMLは汎用的に利用できる拡張可能なマークアップ言語です。ここで、マークアップ言語とは何でしょうか?
マークアップ言語とはテキスト文書に注釈を加えていくことで、視覚表現や文章構造などを記述していく言語であり、代表的なマークアップ言語としてはHTMLなどがあります。例えば、HTMLでは以下のように、テキスト要素を<b></b>タグや<h4></h4>タグのような注釈で囲むことで視覚表現や文章構造を表します。
<h4>サンプルタイトル</h4>
<p>
これは<b>HTML</b>のサンプルです。<br/>
<ul>
<li>リスト1</li>
<li>リスト2</li>
</ul>
</p>
サンプルタイトル
これはHTMLのサンプルです。
- リスト1
- リスト2
HTMLでは<b></b>タグは太字を表し、<h4></h4>タグは見出しを表すと定められているので、それに従って注釈(マークアップ)を加えていくことで思い通りのレイアウトや構造の文章を作成してくことができます。しかし、逆に言うと自分で新たなタグを定義したり、すでにあるタグの意味を勝手に変えたりすることはできません。つまり、拡張不可能なマークアップ言語ということができます。
それに対して、<b></b>タグのような具体的なタグの意味は定義せずに、タグの書き方の規則だけを決めた規格がXMLといえます。つまり、XMLの規則に従って自分で好きなタグを新たに定義していくことが可能であり、これが「拡張可能なマークアップ言語」と呼ばれる所以です。自分でオリジナルのタグを定義することで、独自のデータ保存形式を作ることができるので、XMLはいたるところで使われています。代表的なものとしては以下のものがあります。
- Office Open XML:ワード文書(.docx)、エクセルファイル(.xlsx)、パワーポイントファイル(.pptx)など
- SVG:ベクター形式の画像ファイル形式
ワードやエクセルのファイル形式もXMLなので、多くの方が何らかの形でかかわっている形式ではありますが、一方であくまでもXMLでは抽象的な形式的なものしか定義しておらずその実体は改めて定義する必要があるので、多くの方は知らず知らずのうちに使っているものでもあります。
そして、ここで説明するXAMLもXMLに準拠したマークアップ言語の1つになります。XAMLについてみていく前に、まずはXMLの基本的な規則について確認していきましょう。
XMLの構成
XML文書は以下の3つの部分から構成されます。
- XML宣言
- 文書型定義(DTD)
- XMLインスタンス
それでは順番にXML文書の各要素について見ていきましょう。
XML宣言(省略可能)
XML文書では、まずそのXML文書が準拠するXML規格のバージョンや使用する文字コードなどを宣言するXML宣言が定義されます。
XML宣言の基本構文
<?xml version="バージョン" encoding="文字コード" standalone="yes/no"?>
バージョン情報
XMLのバージョンには1.0と1.1があり、どちらかを指定します。XML宣言を記述する場合はバージョン情報は省略できません。
Encoding宣言
ドキュメント内の文字を表すために使用するエンコーディングを指定します。なお、UTF-8またはUTF-16を用いた場合はXMLパーサーは自動的に識別できるので省略可能ですが、他のエンコードを使用する場合は省略不可です。
Standalone宣言
ドキュメントがその内容に関して、外部ドキュメント型定義 (DTD) などの外部情報に依存しているかどうかを示し、yesかnoで指定します。Standalone宣言は省略可能で、省略した場合はデフォルト値のnoとなります。
XML宣言の例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
この例ではXMLバージョンは1.0となっていて、文字コードはUTF-8となっており、外部ドキュメント型定義を使用するという宣言になっています。なお、XML宣言自体は省略可能です。
文書型定義(DTD) (省略可能)
文書型定義(DTD)はXMLにおいて、文書構造(文書型)を定義するためのスキーマ言語の一つです。DTDの基本的な構文は次のようになります。
DTDの基本構文
<!DOCTYPE books[
…
]>
ただしDTDは省略可能であり、DTDの欠点(XMLとは異なる文法を採用している、XML名前空間に対応していないなど)のために、最近は利用頻度は減っています。
XMLインスタンス
XMLインスタンスがXML文書のメインの部分であり、1つのルート要素から成るツリー構造となっていることが特徴です。XMLインスタンスは省略することはできません。
XMLインスタンスの基本構文
<要素名 属性="値">コンテンツ</要素名>
要素
開始タグと終了タグで囲まれたXMLデータの最小単位を要素と呼び、XMLインスタンスの最初に出現する要素をルート要素といいます。また、要素の開始タグと終了タグの間に要素を入れて、子要素を作成することもできます。
特殊な要素としては次のようなものがあります。
空要素
<要素名 属性="値" />
- コンテンツを持たない要素を空要素と呼び、タグを”/>”で閉じます。また、空要素に属性を設定することも可能です。
コメント
<!-- コメント内容 --!>
- 開始タグ”<|–“と終了タグ”–!>”で囲まれる要素はコメントとなり、その中に記述した内容はプログラムからは無視されます。
属性
開始タグ内に記述し、その要素に付帯する情報を属性と呼びます。主に、要素に対して補足するような情報の記述に用いられます。なお、複数の属性を並べて記述する場合はスペース区切りで指定するので、属性名と”=”の間などにスペースを入れることはできません。
特殊な属性としては次のようなものがあります。
グローバル属性
<要素名 属性:接頭辞="値">コンテンツ</要素名>
- 特定の要素固有ではない、汎用的な属性をグローバル属性と呼び、属性と接頭辞を”:”でつなげて表現します。
- ここで指定した接頭辞がエイリアスとなり、エイリアスを指定することでほかの要素から呼び出すことも可能となります。
名前空間(xmlns属性)
<要素名 xmlns="http:――"/>
<要素名 xmlns:接頭辞="http:――"/>
- 名前空間を表す属性名はxmlns属性としてあらかじめ用意されています。
- 名前空間の定義は、その名前空間が及ぶ範囲の一番上位の要素の属性にxmlns属性として指定します。
- 接頭辞をつけずにxmlns属性を指定するとデフォルト名前空間となり、その名前空間の及ぶ範囲内の要素は自動的にその名前空間に所属するようになります。一方、接頭辞をつけてグローバル属性として定義した場合は、その接頭辞をつけてその名前空間に所属することを表現する必要があります。
なお、要素に対して情報をつけたす方法には、コンテンツ部分に記述して子要素とするか、属性として指定するかの2つの方法がありますが、子要素とする場合は属性と比較して「要素の順番にも意味がある」「孫要素を作成できる」という違いがあります。
XMLとXAMLの関係
C#アプリ(.NETアプリ)におけるGUIを記述するためのマークアップ言語であるXAMLは、ここで説明したXMLに準拠して独自にタグを定義したものになります。XAMLについては以下の記事をご覧ください。
コメント