XMLマスターへの道
〜「XMLマスター:ベーシック」試験対策〜

第4回 すべてのXML文書は整形式である

武田栄子
ウチダ人材開発センタ
2003/2/14

 今回は、前回 (「第3回 XML文書の要素、エンコーディング、宣言」)の解説の続きです。また、前々回(「第2回 XMLの概要と起源、関連規格」)に出題された下記の問題の解答も紹介します。

今回の問題
(Q1) 整形式XML文書をすべて選択してください。なお、文字エンコーディングは合っているものとします。

(a)
<?xml version='1.0'?>
<root>
  <a b="c"/>
</root>

(b)
<?XML version="1.0"?>
<root>
  <expr>4<1</expr>
</root>

(c)
<社員 番号="0001">
  <名前>佐藤太郎</名前>
</社員>
<社員 番号="0002">
  <名前>山田花子</名前>
</社員>

(d)
<あいうえお/>

(e)
<予定>
 <10月20日>紅葉狩り</10月20日>
</予定>

(f)
<H1>見出し1</h1>

(Q2) 以下のXML文書で要素を表しているものを1つ選択してください。

「XML文書」
<book isbn="012-345-6789">
XMLマスター:ベーシック対策
</book>

(a) book
(b) <book>
(c) isbn="012-345-6789"
(d) XMLマスター:ベーシック対策
(e) </book>
(f) <book isbn="012-345-6789">XMLマスター:ベーシック対策</book>

 前回は、この問題に解答するうえで必要な知識のうち、下記の5つについて解説しました。

  • XML文書
  • XMLパーサ
  • 要素
  • 文字エンコーディング
  • XML宣言

 今回は、残りの下記6つについての解説です。

  • 命名規則
  • 属性
  • ルート要素
  • 定義済み実体
  • コメント
  • well-Formed XML(整形式XML)

 まず、下記に説明のサンプルで使うXML文書の基になる社員データを示します。前回と同じものです。

項目名 データ
name Taro Yamada
dept Sales
表1 XML文書の基になる社員データ (emp)

命名規則

 XMLの特徴として、目的に合わせたタグ (正確には要素名) を利用者が作成できると、「第2回 XMLの概要と起源、関連規格」で解説しました。ただし、まったく自由にタグを作成できるわけではなく、一定条件の命名規則に従ったうえで名前を付けるよう規定されています。XML文書内の名前として利用できる文字は、XML 1.0仕様「Appendices B Character Classes」下の個条書きリストに規定されています。

 試験対策のポイントとして、XML文書内で名前として使ってはいけないケースを下にまとめました。

  1. 全角英数字、半角カナ、丸付き数字を含んではいけない
  2. 1文字目に数字は使えない
  3. 「XML」から始まる名前は大文字小文字の組み合わせを問わず、予約されているので使えない

 名前の開始文字として使える文字は下記のとおりです。ただし、コロン「:」は名前空間でセパレータとして使うため、名前の中に含めることはお勧めしません。

  1. Letterクラス(Character [84]) の文字(半角英字、ひらがな、全角カナ、漢字など)
  2. _ (アンダースコア)
  3. : (コロン)

 前回、非ASCII文字を処理できるようにシフトJISで文字エンコーディング宣言をしたので、表2を参考に要素名を日本語に変更してみましょう。

要素名 内容の種類 内容
emp→社員 子要素 名前要素、部署要素
name→名前 文字データ 山田 太郎
dept→部署 文字データ 営業
表2 要素名を日本語へ変更

<?xml version="1.0" encoding="Shift_JIS"?>
<社員>
  <名前>山田 太郎</名前>
  <部署>営業</部署>
</社員>
リスト1 要素名を日本語に変更した後のXML文書(test3_08.xml

属性

 XMLでは要素に対して付加情報を追加したい場合、属性を記述することができます。属性は開始タグの要素名に空白を入れ、

属性名="属性値"

の形式で記述します。「=」と属性値を省略することはできません。前述の「XML宣言」内の各宣言と同様に、属性値は=の右辺にある値は二重引用符 「"」または一重引用符 「'」 でくくります。なお、属性名の命名規則は前述の要素に対する「命名規則」と同じです。

<要素名  属性名="属性値">
属性の構文

図1 属性を構成する各部の名称

 1つの要素の中に要素名と同じ属性名を記述することは可能ですが、XML文書の設計上はあまり望ましくありません。

<root root="abc"/>
リスト2 要素の中に要素名と同じ属性名を使う(test3_09.xml

 1つの要素の中に複数の属性を含めることは可能です。その場合、直前の属性値の後ろに空白を入れて属性を記述します。

<root attr01="abc" attr02="def"/>
リスト3 要素の中に、複数の属性を含める(test3_10.xml

 ただし、1つの要素の中に同じ属性名を持つ属性を含めることはできません。

<root attr01="abc" attr01="def"/>
リスト4 要素の中に、同じ属性名を複数含めることはできない(test3_11.xml

 いままでの解説を参考に、社員要素の付加情報として社員番号属性を追加しましょう。山田太郎氏の社員番号を5とした場合をリスト5に示します。

<?xml version="1.0" encoding="Shift_JIS"?>
<社員 社員番号="5">
  <名前>山田 太郎</名前>
  <部署>営業</部署>
</社員>
リスト5 社員要素の付加情報として、社員番号属性を追加したXML文書(test3_12.xml

ルート要素

 今度は、リスト5に山田太郎氏以外の社員を1件追加してみましょう。ところが、リスト6をInternet Explorerで表示しようとすると、エラーが返ってきます。

<?xml version="1.0" encoding="Shift_JIS"?>
<社員 社員番号="5">
  <名前>山田 太郎</名前>
  <部署>営業</部署>
</社員>
<社員 社員番号="11">
  <名前>鈴木 花子</名前>
  <部署>教育</部署>
</社員>
リスト6 社員データを1件追加したXML文書。ところが、このXML文書はエラーを引き起こす(test3_13.xml

 原因は、ルート要素が2つあるためです。1つのXML文書の中では最上位の親要素は1つのみ存在するようになります。この最上位の親要素のことを「ルート要素」といいます。1つの文書内でルート要素の数が0個、または2個以上存在するときは、エラーとなります。リスト6をよく見てみると、ルート要素が2つあることが分かります。

<?xml version="1.0" encoding="Shift_JIS"?>
<社員 社員番号="5">
  ……
</社員>
<社員 社員番号="11">
 
……
</社員>
リスト6' 最も上位となるべきルート要素(ここでは社員要素)が、リスト6には社員を追加したことで2つできてしまった(test3_13.xml

 これを解決するためには、ただ1つの最上位の要素を作らなければなりません。リスト7では、社員要素よりさらに上位の要素として社員データ要素を定義し、すべての社員要素はこの子要素となるようにしました。

<?xml version="1.0" encoding="Shift_JIS"?>
<社員データ>
  <社員 社員番号="5">
    <名前>山田 太郎</名前>
    <部署>営業</部署>
  </社員>
  <社員 社員番号="11">
    <名前>鈴木 花子</名前>
    <部署>教育</部署>
  </社員>
</社員データ>
リスト7 上位の要素を追加することで、エラーを回避する(test3_14.xml

定義済み実体

 マークアップの命令開始文字である「<」を含んでいる文字データを記述するケースについて考えていきましょう。例えば、“<element>”という文字データをXML文書の中に内容として書きたいと思い、リスト8のように記述すると、エラーとなってしまいます。

<root><element></root>
リスト8 内容に“<”を含む文字列を書きたいのだが……(test3_15.xml

 XML 1.0仕様では、“<”を含むさまざまな記号文字を、「&実体名;」と記述して扱うことができます。こうした仕様で予約されているものを「定義済み実体」といいます。なお、HTMLで空白を挿入したいときに使う「&nbsp;」はXML 1.0仕様ではサポートされていません。表3にある5つのみが定義済み実体として存在しています。

定義済み実体 記述
& &amp;
< &lt;
> &gt;
' &apos;
" &quot;
表3 定義済み実体

 そして、いまの解説を基にデータを変更したものがtest3_16.xmlです。

<root>&lt;element&gt;</root>
リスト9 リスト8の内容を定義済み実体を用いて記述した(test3_16.xml

画面3 “<”を含む内容がきちんと表示される

コメント

 コメントは、ほかの言語と同様に補足説明を入れたり、コメントを入れた個所を一時的に処理対象外とする目的で使われます。複数行にまたがってコメントに含めることもできます。

<!--コメント文-->
コメントの構文

 なお、XMLパーサはコメント内のデータを文字データの解析対象外として扱います。そのため、コメント内に「<」や「&」などの特殊記号をそのまま記述しても、エラーとなりません。

<root>
  <!-- Tom&Jerry -->
</root>
リスト10 コメント内には特殊記号をそのまま記述してもいい(test3_17.xml

well-formed XML(整形式XML)

 今回のテーマタイトルである「well-formed XML (整形式XML)」について解説します。well-formed XMLとは、XML 1.0仕様で規定されている文法に従って記述されているテキストドキュメントです。最初に解説したXML文書のことを指しており、すべてのXML文書はwell-formed XMLとなります。

 well-formed XMLに適用される規則のことを「整形式制約」といいますが、この制約がいままで解説してきた事柄です。整形式制約に違反した場合「致命的エラー」としてアプリケーションに伝えなければいけません。

 XML文書を制約という観点からみると、well-formed XML以外に「valid XML(妥当なXML)」がありますが、こちらは次回に解説します。

問題の解答

 問題の解答は次のとおりです。先述の解説を読み直し、試験に向けて備えてください。

(Q1) 整形式XML文書をすべて選択してください。なお、文字エンコーディングは合っているものとします。

 答えは(a)(d)です。整形式XML文書に関する解説は、「well-formed XML」が参考になります。

 (a) : 整形式制約を満たしています(参考になる解説 「XML宣言」「要素」「属性」)。
 (b) : XML宣言のキーワードはすべて小文字で記述します。「<」のような特殊記号を文字列として扱いたいときに、特殊記号を直接記述するとエラーになるので定義済み実体などを利用します(参考になる解説 「定義済み実体」)。
 (c) : 1つの文書内でルート要素は1個のみです(参考になる解説 「ルート要素」)。
 (d) : 文字エンコーディングが適切に指定されていれば、日本語の文字を要素名に指定できます(参考になる解説 「命名規則」「要素」)。
 (e) : 名前の開始文字に数字は使えません(参考になる解説 「命名規則」)。
 (f) : XMLでは大文字小文字を識別するため、開始タグと終了タグの要素名は大文字小文字の組み合わせが完全に一致しなければなりません(参考になる解説 「要素」)。

 なお、Q1の選択肢ファイルを用意していますので、時間のある方は整形式のXML文書となるように修正してみるといいでしょう(※Windows上で編集できるように、文字エンコーディングをシフトJISへ変更しています)。

(Q2) 以下のXML文書で要素を表しているものを1つ選択してください。

 答えは(f)の<book isbn="012-345-6789">XMLマスター:ベーシック対策</book>です。開始タグ、終了タグ、内容、属性名、属性値の集まりが要素です(参考になる解説 「要素」)。

 前回同様、記事の最後に「まとめノート」を用意しました。このまとめノートには、試験対策のポイント、出題範囲となる仕様、参考になる@ITの記事のリンクをまとめています。

 そして、次回のための予習問題を掲載します。次回はこの予習問題について解説していく予定です。

予習問題
(Q1) DTDについて正しく説明しているものをすべて選択してください。

(a) DTDはXML 1.0仕様の中で規定されている
(b) すべてのXMLパーサはDTDによる妥当性を検証しなければならない
(c) 外部DTDと文書本体の文字エンコーディングは異なってもよい
(d) DTDの記述は大文字小文字を識別する
(e) 外部DTDと内部DTDに同じ名前の要素を宣言することができる
(f) 外部DTDと内部DTDに同じ名前の属性を宣言することができる
(g) A社とB社の間で合意した外部DTDを使うときのキーワードはPRIVATEである

(Q2) 以下のDTDに妥当なXML文書をすべて選択してください。

「DTD」
<!ELEMENT  root  (A | B+)>
<!ELEMENT  A  (#PCDATA)>
<!ELEMENT  B  (#PCDATA)>
<!ATTLIST  A  a (12 | 34 | 56)  "12">
<!ATTLIST  B  b  ID  #REQUIRED>

(a) <root/>
(b) <root>
         <A/><B/>
       </root>
(c) <root>
         <A/>
        </root>    
(d) <root>
         <A  a="12"/>
       </root>
(e) <root>
         <A   a="12"  a="34"/>
       </root> 
(f) <root>
         <A  a="78"/>
       </root>
(g) <root>
         <B/>
        </root>
(h) <root>
         <B  b="12"/>
       </root>
(i) <root>
         <B   b="x12"/>
      </root>
(j) <root>
         <B   b="x12"/>
         <B   b="x12"/>
      </root>
(k)
<root>
         <B  b="x12"/>
         <B  b="y12"/>
      </root>


まとめノート:well-formed XML

○今回の試験対策のポイント

  • XML文書
  • well-formed XML
  • XMLパーサ
  • XMLの構文
  • XML宣言
  • 文書本体
  • 要素
  • 属性
  • ルート要素
  • 文字エンコーディング
  • 命名規則
  • 引用符
  • 定義済み実体
  • コメント

○今回の学習内容で出題範囲となる仕様

○今回の学習内容で実機確認を行うときに役立つフリーツール

○今回の学習内容で参考になる@ITの記事

○今回の学習内容で参考になるXML用語集 (@IT XML用語事典より)

(5)valid XMLとDTDの関係

Index
連載:XMLマスターへの道
  (1)XMLマスター:ベーシック試験のレベルは?
  (2)XMLの概要と起源、関連規格
  (3)XML文書の要素、エンコーディング、宣言
(4)すべてのXM文書は整形式である
  (5)valid XMLとDTDの関係
  (6)模擬問題:XMLの基本
  (7)模擬問題:W3C XML Schema
  (8)模擬問題:DOM
  (9)DTDの実体宣言と記法宣言
  (10)XSLTの基本構造を理解する
  (11)XSLTで必須の制御命令を覚える
  (12)XPathによるノードの指定法を理解する
  (13)名前空間を理解しDOMの概要をつかむ
  (14)XML Schemaを利用したスキーマ定義
  (最終回)XML Schema―型の再利用と名前空間


連載:XMLマスターへの道


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間