連載

.NETで簡単XML

第1回 XML超入門

株式会社ピーデー 川俣 晶
2003/02/13

Page1 Page2 Page3 Page4

ネストする要素

 1つのXML文書に記述できる要素は1つに限定されるわけではない。上の例では名前だけを記述したが、例えば名前と年齢を記述するようなXML文書を考えることもできる。それではということで、以下のような文書を書いてみると、実は使えない。

<?xml version="1.0" encoding="utf-8" ?>
<name>山田五郎</name>
<age>56</age>
複数の要素を記述する(誤った)例

 最初に出現する要素を文書要素あるいはルート要素というが、これは1つしか存在することができないと決まっている。そして文書要素のあとに、要素を書くことはできないのである。そのため、文書要素となるname要素のあとに、age要素を書くことはできない。しかし、もちろん、1つのXML文書に要素は1つしか書けないというわけではない。子要素という手段を使うといくらでも要素を記述することができる。例えば以下のように記述するわけである。

<?xml version="1.0" encoding="utf-8" ?>
<person>
  <name>山田五郎</name>
  <age>56</age>
</person>
複数の要素を記述する例

 この例では、personという要素が新たに増えている。この要素の開始タグと終了タグの間に、name要素とage要素が記述されている。要素の内容には、テキストだけでなく、要素を記述することができる。このように、要素の内容に記述される要素を子要素という。逆に、内容に記述された要素から見た入れ物となっている要素は親要素という。この場合、name要素はperson要素の子要素で、person要素はname要素の親要素ということになる。

 要素は子要素だけでなく、孫要素を持つこともできる。例えば以下のようなXML文書もあり得る。

<?xml version="1.0" encoding="utf-8" ?>
<person>
  <name>
    <familyName>山田</familyName>
    <firstName>五郎</firstName>
  </name>
  <age>56</age>
</person>
孫要素を含むXML文書

 要素がネストする段階数に限界はない。XMLでは、情報を分かりやすく的確に分類、記述するために要素を使って要素をグループ分けし、ネストして記述することが重要である。これがうまく達成できるかどうかで、XMLの使い勝手の善し悪しが大きく変わることになる。しかし、人間が使っている情報をうまく整理分類するのは難しく、一生の仕事になりかねない例もある。そのため、XMLは簡単に入門できるが、極めるには一生をかけることになるかもしれないといわれている。

属性

 要素には、属性という付加的な情報を記述する仕組みが用意されている。

<?xml version="1.0" encoding="utf-8" ?>
<person id="ID0001">
  <name yomi="やまだろくろう">山田六郎</name>
</person>
属性を使用した例

 ここで、person要素に付いているid="ID0001"は属性である。これは何らかのシステムの都合で付けられた認識番号がID0001であるという情報を付加してみた例である。ここで、idは属性名、ID0001は属性の値である。属性の値は“"”(ダブル・クォーテーション)または“'”(シングル・クォーテーション)でくくって表記する。両者の間は“=”(等号)を記述してつなぐ。属性は開始タグの中に記述することができ、終了タグには記述できない。なお、属性名も大文字/小文字を区別する。name要素に付いているyomi="やまだろくろう"も、同様に属性である。

 さて、要素に情報を付け足すには、子要素を記述する方法もある。子要素を記述するのと属性を記述するのは同じことなのだろうか? そうではない。この2つは少々異なる性質を持っていて、使い分ける必要が存在するのである。まず、要素には属性や子要素を付けることができるが、属性に子要素や子属性を付けることはできない。次に、子要素には順番があるが、属性に順番はない。例えば、

<a>その1</a><b>その2</b>

と2つの要素を記述した場合と、

<b>その2</b><a>その1</a>

と記述した場合は順番が異なっているので、同じ内容とは見なされない。順番も情報もプログラムから容易に取得できる。それに対して、2つの属性を記述した、

<e a="その1" b="その2"></e>

という要素と、属性の順番を変えて記述した、

<e b="その2" a="その1"></e>

という要素は同じものと見なされる。通常、属性が記述された順番を正しく確実にプログラムから取得する手段は提供されていない。

空要素

 要素は、開始タグで始まり、内容が入り、そして終了タグで終わる。開始タグは、“<”(不等号)で始まり、要素名を記述し、そのあとに属性を必要なだけ記述し、“>”(不等号)で終わる。終了タグは“</”(不等号、スラッシュ)で始まり、要素名を記述し、“>”(不等号)を記述して終わる。

 さて、たまに内容が存在しない要素というものもある。これを空要素という。空要素を記述するには、開始タグの直後に終了タグを書けばよい。例えば、以下のような感じである。

<?xml version="1.0" encoding="utf-8" ?>
<document>古池に<newline></newline>川が溢れて<newline></newline>水溢れ</document>
空要素を用いた例

 ここで、newline要素は、ここで行を変えるという意図を表現するために用意したものなので、newline要素自身が内容を持つことに意味はない。しかし、同じ名前が連続して2回出てくると、書くのも面倒だし、読むときもうっとうしい。まあ、VS.NETなら終了タグを自動で入れてくれるので書く手間はそれほど増えないが、それでも終了タグの先にさらに書いていこうとすると、終了タグの終わりまでキャレットを移動させる手間が発生する。こういう場合には、XMLでは空要素タグというものを記述することができる。空要素タグを使用して先ほどの例を書き換えると次のようになる。

<?xml version="1.0" encoding="utf-8" ?>
<document>古池に<newline />川が溢れて<newline />水溢れ</document>
空要素タグを使って書き換えた例

 空要素は、開始タグ+終了タグだけでなく、空要素タグを使って記述することもできる。空要素タグは、“<”(不等号)で始まり、要素名を記述し、そのあとに属性を必要なだけ記述し、“/>”(スラッシュ、不等号)で終わる。ここでは<newline />が空要素タグである。

コメント

 XML文書にコメントを入れることもできる。コメントを入れる場合は、“<!--”と“-->”をペアで記述し、その間がコメントの内容になる。コメントの中には“--”という2文字の連続した記号以外は何を書いても構わない。以下はコメントを記述した例である。

<?xml version="1.0" encoding="utf-8" ?>
<person>
  <name>山田八郎</name>
  <!-- 年齢の正確な情報がないので、仮に86を入れてあります -->
  <age>86</age>
</person>
XML文書にコメントを記述した例

 プログラムから決まりきったデータを出力する場合にはコメントの必要性をあまり感じないかもしれない。しかし、XML文書を手で記述する場合には、しばしば、コメントを入れたくなる場合も出てくるのである。

XML宣言

 これまでの例に付いてきたXML宣言について説明しよう。

 前述のとおり、<?xml version="1.0" encoding="utf-8" ?>という部分がXML宣言にあたる。XML宣言は、それがXML文書であることを明示的に示す役割を持つと同時に、幾つかの付加情報を付け加えることができる。

 XML宣言は「<?xml」で始まり、次に「version="1.0"」という文字列が続く。引用符は“'”(シングル・クォーテーション)を使ってもよいが、ここに記述する内容は決まっており、変化させることはできない。versionには「1.0」という文字列を常に記述する。もちろん、これはXML勧告の1.0に対応した決まりであって、XML 1.1のような仕様が勧告された場合は、そこに「1.1」と記述することになるかもしれない。しかし、いまの所、ここには1.0以外の番号を指定する場面はない。

 その次に、符号化宣言を記述することができる。「encoding="utf-8"」という部分がそれにあたる。引用符は“'”(シングル・クォーテーション)を使ってもよい。引用符で囲まれた範囲内には、符号化方式の名前を記述する。この名前は、IANA(Internet Assigned Numbers Authority)に登録されたCharacter Setsの登録名を使用する。しかし、すべての名前が必ず使用できるわけではなく、UTF-8とUTF-16のみが必須サポートを義務づけられている。そのほかの名前は、システム側の実装次第ということになる。.NETの世界では、日本でよく使われるShift_JIS、EUC-JP、ISO-2022-JPも使用できるが、世の中のすべてのXML対応ソフトがこれらの名前を理解するわけではない。符号化宣言は省略可能であるが、UTF-8以外を使っているときは文字化け防止のため書く方がよい。なお、大文字と小文字は区別されない。

 符号化宣言の次にはスタンドアロン文書宣言(非依存文書宣言)というものを記述することができる。これは、今回は解説しない文書型定義(DTD:Document Type Definition)という機能と密接に結びついているので、詳しい説明は行わない。スタンドアロン文書宣言は、文書の内容に影響を与えるマーク付け宣言が文書実体の外部またはパラメタ実体の中に出現するかどうかを示すものである。

 以下は、XML宣言の例である。まず、符号化宣言もスタンドアロン文書宣言が付いていない場合である。

<?xml version="1.0"?>

 次は符号化宣言が付いた例である。

<?xml version="1.0" encoding="utf-8"?>

 さらに、符号化宣言に加えてスタンドアロン文書宣言が付いた例である。

<?xml version="1.0" encoding="utf-8" standalone='yes'?>

 引用符は“"”(ダブルクォーテーション)でも“'”(シングルクォーテーション)でも構わないので、次に示すように混用しても可である。ただし、始まりの引用符と終わりの引用符は一致している必要がある。

<?xml version="1.0" encoding="utf-8" standalone='yes'?>

 最後に、符号化宣言はなく、スタンドアロン文書宣言だけが付いた例である。

<?xml version="1.0" standalone='yes'?>
 

 INDEX
  .NETで簡単XML
  第1回 XML超入門
    1.プログラマーにとって重要度を増すXML
    2.簡単なXML文書
  3.ネストする要素、属性、空要素、コメント、XML宣言
    4.XMLにおける名前空間
 
インデックス・ページヘ  「連載 :.NETで簡単XML」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間