目次


新たに使い始める人のための XML の基礎

適切なマークアップへの入門

Comments

XML とは Extensible Markup Language のことですが、このうちの Markup が重要です。コンテンツを作成した後、それを区切りタグでマークアップすると、各単語や語句、あるいはそれぞれのチャンクが識別可能でソート可能な情報になります。このようにして作成されるファイル、つまり文書インスタンスは、要素 (タグ) とコンテンツから構成されます。そして要素のおかげで、印刷出力から読み取る場合にも、あるいは電子的に処理する場合にも、文書を非常に理解しやすくなります。要素の記述が詳細であればあるほど、その文書の中のより多くの部分を識別することができます。マークアップが登場した初期の頃から今日まで、コンテンツにタグ付けすることによる 1 つの利点は、たとえコンピューター・システムが故障してしまい、出力されたデータしか見られなくても、そのデータのタグからデータの内容を理解できることです。

初期のマークアップ言語は企業や政府ごとに独自の形式でしたが、それが SGML (Standard Generalized Markup Language) に、そして HTML (Hypertext Markup Language) に、そして最終的に XML に進化しました。SGML は複雑に感じられる場合があり、また HTML は (実は単なる要素セットにすぎず) 情報の識別用としてはあまり強力ではありませんでした。XML は使いやすく拡張しやすいマークアップ言語として設計されています。

XML を利用すると、独自の要素を作成することができます。そのため、必要な情報を正確に、しかも自由に表現することができます。文書を見出しと段落のまとまりとして扱う代わりに、文書内の各部分を識別することができます。効率的な文書にするためには、限定的な要素リストを定義し、厳密にその要素リストに従います。(要素の定義は DTD (Document Type Definition) あるいはスキーマの中で行います。これについては後ほど簡単に説明します。) XML を使い始め、そして XML に慣れたら、練習用のファイルを作成しながら自由にさまざまな要素名を試してみてください。

XML を作成する

先ほど触れたように、XML ファイルはコンテンツとマークアップで構成されます。コンテンツの大部分はタグに囲まれて要素の中に置かれます。例えば料理の本を XML で作成したいとします。Ice Cream Sundae (アイスクリーム・サンデー) という名前のレシピを XML で表現する場合、このレシピの名前をマークアップするためには、そのレシピのテキストを要素で囲みます (テキストの前に開始タグを置き、そしてテキストの後に終了タグを置きます)。この要素を recipename と呼ぶことにします。この要素の開始タグをマーキングするためには、その要素の名前を不等号括弧 (<>) で囲みます (<recipename> のようにします)。続いてレシピの名前 Ice Cream Sundae を入力し、このテキストの後に、この要素の終了タグを入力します。終了タグは、要素名を不等号括弧で囲むとともに、要素名の前にスラッシュ (/) があるように (</recipename> のように) します。これらのタグによって要素が構成され、要素の中にはコンテンツや、さらには他の要素も入れることができます。

一連の要素名は個々の文書に対して定義することも、文書のセットに対して定義することもでき、特定のニーズに合わせてさまざまな要素をどのように組み合わせるかの規則を決めることもできます。また、要素名は非常に具体的なものにすることも、あるいは汎用的なものにしておくこともできます。さらに、各要素に何を含められるかの規則を作成し、そうした規則を厳密に従わなければならないものにしたり、緩い規則にしたり、あるいはその中間的なものにすることもできます。重要なことは、重要と見なされる部分を文書の中で識別できるように要素を定義する必要があるということです。

XML ファイルの作成を開始する

XML 文書の最初の行には XML 宣言がある場合があります。XML 宣言はファイルのオプション部分であり、このファイルが XML ファイルであることを示します。XML 宣言によって、ツールや人間はこのファイルが XML であり、SGML や他のマークアップのファイルではないと認識することができます。この宣言を単純に <?xml?> と書くこともでき、あるいは XML のバージョンを含めることもでき (例えば <?xml version="1.0"?> など)、さらには文字エンコーディングを含めることもできます (例えば unicode 用に <?xml version="1.0" encoding="utf-8"?> など)。この宣言はファイルの先頭になければならないため、小さな XML ファイルを組み合わせて大きなファイルを作りたい場合には、このオプション情報を省略する必要があるかもしれません。

ルート要素を作成する

ルート要素の開始タグと終了タグで XML 文書のコンテンツを囲みます。ルート要素はファイルの中に 1 つのみであり、この「ラッパー」にファイルの中のすべてを含めなければなりません。リスト 1 はこの記事で使用するサンプルの一部として、<recipe> という名前のルート要素を示したものです。(完全な XML ファイルについては「ダウンロード」セクションを参照してください。)

リスト 1. ルート要素
<?xml version="1.0" encoding="UTF-8"?>
<recipe>
</recipe>

文書を作成しながら、<recipe></recipe> の間にコンテンツとタグを追加していきます。

要素に名前を付ける

ここまでの段階で、ルート要素としての <recipe> が用意できました。XML では、要素に対する名前を選択し、次にそうした名前に対応する DTD またはスキーマを名前に基づいて定義します。作成する名前には、アルファベット文字、数字、そしてアンダーバー (_) などの特殊文字を含めることができます。以下は名前についての注意点です。

  • 要素名の中に空白を含めることはできません。
  • 名前はアルファベット文字で始まる必要があり、数字や記号で始まってはなりません。(この最初の文字の後は、文字や数字、使用可能な記号などを任意に組み合わせることができます。)
  • 大文字小文字の使用は自由ですが、混乱を避けるために一貫性を持たせる必要があります。

先ほどの例を元に作成を続けると、<recipename> という名前の要素を追加する場合には、その要素は開始タグ <recipename> と、対応する終了タグ </recipename> を持つ必要があります。

リスト 2. 要素を追加する
<?xml version="1.0" encoding="UTF-8"?>
<recipe>
<recipename>Ice Cream Sundae</recipename>
<preptime>5 minutes</preptime>
</recipe>

XML 文書は空のタグを持つことができます。空のタグは中に何も持たず、開始タグと終了タグのセットではなく単一のタグとして表現することができます。HTML 風の例を使うと、単独の要素として <img src="mylogo.gif"> を持つことができます。この要素は子要素やテキストを何も含まないので空要素であり、<img src="mylogo.gif" /> と表現することができます (空白と、おなじみのスラッシュを最後に付けます)。

要素のネスト

ネストとは要素を他の要素の中に配置することを言います。これらの新しい要素は子要素と呼ばれ、子要素を囲む要素は親要素です。リスト 3 では、いくつかの要素が <recipe> というルート要素の中にネストされています。これらのネストされた子項目には、<recipename><ingredlist><preptime> があります。<ingredlist> 要素の中には、この要素自身の子要素である <listitem> が複数あります。XML 文書の中ではネストの深さが何レベルにも達する場合があります。

よくある構文エラーとして、親要素と子要素のネストが不適切な場合があります。子要素はすべて、その親要素の開始タグと終了タグの間に完全に囲まれていなければならず、また各兄弟要素は、次の兄弟要素が開始される前に終了していなければなりません。

リスト 3 のコードは適切にネストされている例を示しています。すべてのタグは他のタグと交差することなく開始して終了しています。

リスト 3. 適切にネストされた XML 要素の例
<?xml version="1.0" encoding="UTF-8"?>
<recipe>
<recipename>Ice Cream Sundae</recipename>
<ingredlist>
<listitem>
<quantity>3</quantity>
<itemdescription>chocolate syrup or chocolate fudge</itemdescription>
</listitem>
<listitem>
<quantity>1</quantity>
<itemdescription>nuts</itemdescription>
</listitem>
<listitem>
<quantity>1</quantity>
<itemdescription>cherry</itemdescription>
</listitem>
</ingredlist>
<preptime>5 minutes</preptime>
</recipe>

属性を追加する

要素に属性が追加されることがあります。属性は名前と値のペアで構成され、値は二重引用符 (") で囲まれます (例えば type="dessert" など)。属性を利用すると、ある要素を使用するごとに別の情報を保存することができます (例えば同じ文書の中で、ある要素のインスタンスごとに必要に応じて属性の値を変化させる、など)。

属性は (属性が複数ある場合も) 要素の開始タグの中に含めます (例えば <recipe type="dessert"> など)。複数の属性を追加する場合には、それぞれの属性を空白で区切ります (例えば <recipename cuisine="american" servings="1"> など)。リスト 4 は、ここまでの段階での XML ファイルを示しています。

リスト 4. ここまでの段階での XML ファイルの要素と属性
<?xml version="1.0" encoding="UTF-8"?>
<recipe type="dessert">
<recipename cuisine="american" servings="1">Ice Cream Sundae</recipename>
<preptime>5 minutes</preptime>
</recipe>

属性の数は必要に応じて、いくらでも少なくすることも多くすることもできます。属性を追加する際には、文書にどの程度の詳細を追加する必要があるかを考えます。例えば文書がレシピのタイプごとに分類して保存される場合には、属性は特に役に立ちます。属性の名前には要素名と同じ文字群を含むことができ、また空白が許可されないことや名前をアルファベット文字で始める必要があるといった規則は同じです。

整形式の XML と妥当な XML

構造によって規則の概要が示され、この規則に従うことで整形式の XML を容易に作成することができます。整形式の XML というのは、要素の命名規則やネストの規則、属性の命名規則など、XML に関するすべての規則に従う XML です。

XML を使って何をするかによりますが、XML は整形式でなければなりません。しかし先ほどの例のように、レシピのタイプによってソートする場合を考えてみてください。レシピをソートするためには、すべての <recipe> 要素が必ず type 属性を含む必要があります。この属性の値が必ず存在することを適切に妥当性検証でき、保証できることは、非常に重要なことです。

妥当性検証というのは、要素に関する規則に対して、また各親要素に対して子要素がどのように定義されているかの規則に対して、文書の構造をチェックすることを言います。これらの規則は DTD (Document Type Definition) またはスキーマの中で定義します。この妥当性検証を行うためには DTD またはスキーマを作成し、その DTD またはスキーマのファイルを XML ファイルの中で参照する必要があります。

妥当性検証を有効にするためには、文書型 (DOCTYPE) を XML 文書の先頭付近に含めます。この行によって、その文書を妥当性検証するために使われる DTD またはスキーマ (要素や規則のリスト) を参照します。例えば DOCTYPE はリスト 5 のようなものになります。

リスト 5. DOCTYPE
<!DOCTYPE MyDocs SYSTEM "filename.dtd">

この例では、要素リストのファイルが filename.dtd という名前であり、そのファイルがコンピューターの中 (SYSTEM、または公開のファイル位置を指す場合には PUBLIC) にあるとしています。

実体 (ENTITY) を使う

実体 (ENTITY) は、テキストで構成される語句である場合や特殊文字の場合があります。また、実体は内部で参照されることも外部で参照されることもあり、宣言や表現を適切にしないとエラーが起きたり、適切に表示されなかったりする場合があります。

コンテンツの中に特殊文字を直接入力することはできません。テキストの中で記号を使うためには、その記号の文字コードを使って実体を参照する必要があります。あるいは会社名などの語句を実体として参照し、コンテンツ全体を通してその実体を参照することができます。実体を参照するには、実体の名前を記述し、名前の先頭にアンパーサンド (&) を、そして名前の最後にセミコロン (;) を付けます (例えば &coname; など)。そして DOCTYPE の大括弧 ([]) の中には、その実体を宣言するコードを入力します (リスト 6)。このコードによって、その実体参照に置き換わるテキスト文字が特定されることになります。

リスト 6. 実体 (ENTITY)
<!DOCTYPE MyDocs SYSTEM "filename.dtd" [ <!ENTITY coname "Rabid Turtle
Industries"
]>

実体を使用すると、同じ語句や情報を繰り返し入力する必要がなくなるだけでなく、 (例えば会社名が変更された場合などに) テキストの変更が容易になり、多くの場合は単に実体の定義を変更するだけでよくなります。

エラーを回避する

XML ファイルの作成方法を学ぶ際には、それらのファイルを XML エディターで開いて整形式性をチェックし、XML に関する規則に従っていることを確認します。例えば Windows® Internet Explorer® がある場合には、XML ファイルをブラウザーで開くことができます。Internet Explorer で要素や属性、コンテンツが表示されれば、その XML は整形式です。もしエラーが表示される場合には、おそらく構文エラーがあります。そこでその XML 文書を注意深く調べ、タイプミスやタグの欠落がないかどうか、また区切りが適切かどうかなどを確認します。

要素のネスト」で説明したように、別の要素を含む要素は、その包含された要素の親です。下記の例では、<recipe> はルート要素であり、ファイルのすべてのコンテンツを包んでいます。この <recipe> という親要素は、子要素として、<recipename><ingredlist><directions>、その他いくつかの要素を含んでいます。この構造では、<recipename><ingredlist><directions> は兄弟になります。こうした兄弟要素のネストも必ず適切になるようにする必要があります。リスト 7 は整形式で適切にネストされた XML を示しています。

リスト 7. 整形式の XML
<?xml version="1.0" encoding="UTF-8"?>
<recipe type="dessert">
<recipename cuisine="american" servings="1">Ice Cream Sundae</recipename>
<ingredlist>
<listitem><quantity units="cups">0.5</quantity>
<itemdescription>vanilla ice cream</itemdescription></listitem>
<listitem><quantity units="tablespoons">3</quantity>
<itemdescription>chocolate syrup or chocolate fudge</itemdescription></listitem>
<listitem><quantity units="tablespoons">1</quantity>
<itemdescription>nuts</itemdescription></listitem>
<listitem><quantity units="each">1</quantity>
<itemdescription>cherry</itemdescription></listitem>
</ingredlist>
<utensils>
<listitem><quantity units="each">1</quantity>
<utensilname>bowl</utensilname></listitem>
<listitem><quantity units="each">1</quantity>
<utensilname>spoons</utensilname></listitem>
<listitem><quantity units="each">1</quantity>
<utensilname>ice cream scoop</utensilname></listitem>
</utensils>
<directions>
<step>Using ice cream scoop, place vanilla ice cream into bowl.</step>
<step>Drizzle chocolate syrup or chocolate fudge over the ice cream.</step>
<step>Sprinkle nuts over the mound of chocolate and ice cream.</step>
<step>Place cherry on top of mound with stem pointing upward.</step>
<step>Serve.</step>
</directions>
<variations>
<option>Replace nuts with raisins.</option>
<option>Use chocolate ice cream instead of vanilla ice cream.</option>
</variations>
<preptime>5 minutes</preptime>
</recipe>

注意: 改行によってコードが読みやすくなりますが、XML に影響することはありません。

テスト・ファイルを使って、終了タグと開始タグを移動してみたりして、さまざまな実験を行うと、その結果表示されるエラー・メッセージについても理解できるようになります。

XML を表示する

図 1 のように、Internet Explorer で XML を表示すると、開始タグと終了タグがコンテンツを囲む形で要素が明確に表示されます。小さなプラス記号 (+) とマイナス記号 (-) が親要素の隣に表示されており、これらの記号をクリックすることで親要素の中にネストされたすべての要素 (子孫) を親要素の中に折り畳むことができます。

図 1. 一部の兄弟を折り畳んだ XML インスタンスの例
一部の兄弟を折り畳んだ XML インスタンスの例
一部の兄弟を折り畳んだ XML インスタンスの例

まとめ

いくつかの単純な規則を理解できると、XML の要素や属性を柔軟に設計できるようになります。XML の規則は難しいものではありません。また XML 文書を作成するのも難しくはありません。難しいのは、ソートや検索のしやすさの観点で文書の中に何が必要かを判断すること、そしてそうした要求を満たすように要素と属性を設計することです。

文書を作成する目的とコンテンツのマークアップ方法を明確に理解していれば、効率的な要素と属性を作成することができます。それさえできれば、あとは注意深くタグ付けするだけで、整形式で妥当な XML を作成することができます。


ダウンロード可能なリソース


関連トピック

  • developerWorks の XML ゾーンは XML の技術ライブラリーとして、広範な話題を網羅した技術記事やヒント、チュートリアル技術標準、IBM Redbooks などを用意しています。
  • ウィキペディアで XML の項目を調べ、XML について学んでください。
  • W3 School の XML Tutorials を利用して XML の基本から JavaScript などの高度な話題までを学び、皆さんの XML のスキルを磨き、またスキルを試してみてください。
  • World Wide Web Consortium の XML 仕様を読み、大規模な電子出版に、また Web やその他の場所で多種多様なデータを交換するために有効な、この柔軟なテキスト・フォーマットについて学んでください。
  • XML および関連技術において IBM 認定技術者になる方法については、IBM XML certification を参照してください。
  • developerWorks podcasts ではソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML
ArticleID=377810
ArticleTitle=新たに使い始める人のための XML の基礎
publish-date=02242009