XMLマスターへの道
〜「XMLマスター:ベーシック」試験対策〜
第9回 DTDの実体宣言と記法宣言
内藤一彦
NRIラーニングネットワーク株式会社
2003/9/13
「第5回 valid XMLとDTDの関係」でDTDの要素型宣言・属性リスト宣言について解説した後、3回連続で「模擬問題」をお届けしましたが、今回からは通常の解説に戻ります。まず、第5回で出題していた予習問題の解答から見ていきましょう。
編集局注:第5回の予習問題と解答は武田栄子氏(ウチダ人材開発センタ)が執筆されています。 |
第5回 予習問題 | |||
(Q1) 以下のXML文書について正しく説明しているものを選択してください(左端の行番号はXML文書に含まれません)。
|
|||
(Q2) 要素aの内容が10以上20未満となるようにXML Schemaで記述するときに必要な制約ファセットをすべて選択してください。
|
|||
(Q3) DOMについて正しく説明しているものをすべて選択してください。
|
予習問題の解答は次のとおりです。
(Q1) 以下のXML文書について正しく説明しているものを選択してください。
答えは、(a)(b)(f)(i)(k)(l)です。
MSXML 3.0 SP2日本語版を使い、JavaScriptで実装したサンプルを用意しました(Q1.html、Q1.xml)。筆者の環境(Windows 2000 Professional SP3、Internet Explorer 6.0 SP1)で動作確認していますが、MSXML 3.0のインストールが行えていれば画面イメージ図と同じように動作するかと思います。
Q1の解答サンプル(Q1.html、Q1.xml) |
この問題で使用しているXML文書では、ルート要素でデフォルトおよび名前空間接頭辞testの名前空間を宣言しています。デフォルトの名前空間を適用した要素から名前空間のスコープが適用されます。
ただし、デフォルトの名前空間が適用されている範囲であっても、属性で名前空間接頭辞が指定されていなければ、その属性はどの名前空間にも属さないことになります。属性を任意の名前空間に属させたい場合、明示的に名前空間接頭辞を付加する必要があります。どの名前空間にも属さないようにしたい場合、適用したい要素にxmlns=""を記述してください。
名前空間のスコープに関する問題は出題頻度が高いので、
- 名前空間を宣言した要素における取り扱い
- デフォルトの名前空間における取り扱い
- 属性における取り扱い
- 名前空間の取り消しにおける取り扱い
を整理しておきましょう。
(Q2) 要素aの内容が10以上20未満となるようにXML Schemaで記述するときに必要な制約ファセットをすべて選択してください。
答えは、(a)(d)です。
xxxInclusiveの場合、値の範囲が「以下」「以上」となるように制約します。xxxExlusiveの場合、値の範囲が「未満」「より大きい」となるように制約します。
(Q3) DOMについて正しく説明しているものをすべて選択してください。
答えは、(a)(c)(d)です。
Q1のサンプルであるQ1.html、Q1.xmlはJavaScriptで実装していますが、DOMを使う場合、JavaやVBなどほかの言語でも実装でき、実装言語を特定していません。DOMはXMLやHTMLへのアクセスを提供するAPIで、W3Cの勧告です。SAX(Simple API for XML)は、XML文書をシーケンシャルにアクセスするAPIで、W3Cの仕様ではありません。プロフェッショナル試験でもDOMとSAXとの比較を問われることが多いので、整理しておくとよいでしょう。
ここからは今回のテーマであるDTDの実体宣言・記法宣言について解説していきます。
今回の問題 | |||||
(Q1) 次の宣言で定義される外部実体の参照方法として正しいものをすべて選んでください。
|
|||||
(Q2) JPGファイル形式の外部ファイルの外部解析対象外実体としての参照方法として正しいものをすべて選んでください(要素名、属性名については考慮する必要はありません)。
|
今回は、この問題に解答するうえで必要となる下記の内容について解説します。
- 実体宣言
実体の種類
実体宣言の記述形式 - 記法宣言
実体の種類
繰り返し使われるような文字列に簡単な名前を付けておき、XML中でその名前を指定することにより実際の文字列を参照することができます。この場合の実際の文字列が「実体」です。実体としては文字列のほかに、外部ファイル(テキストファイル、非テキストファイル)を参照することができます。
実体には、次の分類法があります。
一般実体 or パラメータ実体 | |
一般実体 | XML文書本体で参照を行う |
パラメータ実体 | DTDで参照を行う |
内部実体 or 外部実体 | |
内部実体 | 参照する実体が文字列 |
外部実体 | 参照する実体が外部ファイル |
解析対象 or 解析対象外 | |
解析対象 | 参照する実体をXMLパーサで解析できる(テキストデータ) |
解析対象外 | 参照する実体はXMLパーサで解析できない(バイナリデータ) |
実体の種類は上記分類の組み合わせで決まり、実体の種類によって実体宣言や実体参照の記述形式が異なります。
内部一般実体
これは、XML文書本体で文字列を参照するタイプの実体です。
|
内部一般の実体宣言の構文 |
|
実体の参照 |
<!DOCTYPE EMPLOYEES [ |
リスト1 実体宣言・内部実体参照を行っているXML(EMPLOYEE1.xml) |
このXMLドキュメントをInternet Explorerで表示すると次のようになります。
画面1 実体名が参照する文字列に置き換わった |
DEPT要素の値が実体に置換されていることが確認できます。実体の参照・置換は、XMLドキュメントがXMLパーサに解析される際に行われます。
外部一般実体
これは外部ファイル(外部サブセット)を参照し、その中に記述されているテキストデータを参照するタイプの実体です。
|
外部実体宣言の構文 |
上述の構文では外部ファイルの参照にSYSTEMキーワードを使用していますが、外部サブセットのDTDを参照するのと同様のPUBLICキーワードを使用する形式も取れます(「第5回 valid XMLとDTDの関係」の「DTDの記述場所」を参照)。
|
PUBLICキーワードを使用した外部実体宣言の構文 |
|
実体の参照 |
<!DOCTYPE EMPLOYEES [ |
リスト2 実体宣言・外部実体参照を行っているXML(EMPLOYEE2.xml) |
<?xml version="1.0" encoding="Shift_JIS" ?> |
リスト3 外部実体として参照される外部ファイル(dept1.txt) |
このXMLドキュメントをInternet Explorerで表示すると次のようになります。
画面2 外部実体参照により実体が文字列に置き換わった |
外部実体を使用する場合、外部実体となる外部ファイル内の記述と外部参照の使用場所に注意が必要です。
まず、外部ファイルの文字エンコーディングにUTF-8/16以外を使用している場合、外部サブセットのDTDと同様にテキスト宣言を記述してください(「第5回 valid XMLとDTDの関係」の「DTDの記述場所」を参照)。また、外部ファイルはXML形式である必要はありません。
次に、外部参照の使用場所についてですが、属性値として外部実体を参照することはできません。例えば、次の例を見てみましょう。
<!DOCTYPE EMPLOYEES [ |
リスト4 実体宣言・内部実体参照を行っているXML(EMPLOYEE3.xml) |
<?xml version="1.0" encoding="Shift_JIS" ?> |
リスト5 外部実体として参照される外部ファイル(emp1.txt) |
このXMLドキュメントをInternet Explorerで表示すると次のようになります。
画面3 属性値に外部実体を参照するとエラーになる |
表示されるメッセージからも分かるように、属性値として参照することができません。要素の内容として参照しましょう。
パラメータ実体
これは、DTDで参照するタイプの実体です。DTD内で繰り返し使用する文字列を置換するのに便利です。
|
パラメータ実体宣言の構文 |
|
実体の参照 |
パラメータ実体の宣言や参照には、“%”を使用します。実体宣言で、“%”と実体名の間には区切り文字(半角スペースやタブ)が必要ですので注意しましょう。
<!ENTITY %
string "(#PCDATA)"> |
リスト6 パラメータ実体を使用しているDTD |
このDTDでは、(#PCDATA)という文字列に対して、stringという名前を使用しています。
外部解析対象外実体
これは、テキストファイルでない外部ファイル(イメージファイルなど)を参照する場合に使用します。参照するとはいえ、前述までの実体とは異なり外部ファイルの内容に置換されるわけではありません。あくまでも、非テキストファイルを参照するがXMLパーサでは解析できないことを宣言するものです。
外部解析対象外宣言の形式は、外部一般実体宣言とよく似ています。宣言の後方に「NDATA 記法名」を追加します。
|
外部解析対象外実体宣言の構文 |
上記の記法名は、記法宣言(後述)で定義した名前です。
実体の参照方法は、いままでのものとまったく異なります。専用のENTITY型属性を使用し、その属性値で実体名を指定します。
次のXMLでは、社員の顔写真画像ファイルを外部ファイルとして参照しています。
<!ELEMENT EMPLOYEE (Name,Dept)> |
リスト7 外部解析対象外実体を使用するDTDの一部 |
<EMPLOYEE img="img1"> |
リスト8 外部解析対象外実体を参照するXMLの一部 |
記法とは、解析対象外とする外部ファイルの形式を宣言するものです。外部解析対象外実体を使用するときに、実体宣言とともに宣言が必要となります。
|
記法宣言の構文 |
記法のURIには、外部ファイルを処理するためのプログラムファイル名やアプリケーション名を指定します(だからといって、そのアプリケーションが起動し外部ファイルを開くわけではありません)。
外部解析対象外実体の宣言と併せて記法宣言を記述している例です。
<!ELEMENT EMPLOYEE (Name,Dept)> |
リスト9 解析対象外とする外部ファイルとその記法宣言の記述例 |
■今回の問題の解答
(Q1) 次の宣言で定義される外部実体の参照方法として正しいものをすべて選んでください。
答えは、(a)と(b)です。
この問題に関して参考になる解説は、「実体宣言の記述形式」です(外部一般実体、パラメータ実体)。
問題に使用されているのは、外部一般実体です。実体は、&実体名;と記述することにより参照できます。ただし、外部実体の場合、属性値として参照できないので、(c)は誤りとなります(仮にこの実体が内部一般実体であれば可能)。
(Q2) JPGファイル形式の外部ファイルの外部解析対象外実体としての参照方法として正しいものをすべて選んでください(要素名、属性名については考慮する必要はありません)。
答えは、(d)です。
この問題に関して参考になる解説は、「実体宣言の記述形式(外部解析対象外実体)」「記法宣言」です。
外部解析対象外実体の参照は、属性値で実体名を指定することにより行います。ただし、その属性はENTITY型で宣言されている必要があります。この属性がCDATA型などほかの型で宣言されている場合、その属性値は単なる文字列としてしか扱われません。
この問題で使用される例では、実体宣言以外には次の宣言が必要となります。
<!ELEMENT IMG
(#PCDATA)> |
リスト10 赤字は本来必要となる宣言 |
■次回の予習問題
次回のためにの予習問題を掲載します。XMLの構造変換を行うためのXSLTの基本構造について解説していく予定です。
予習問題 | |||
(Q1) 次のXSLT要素のうちトップレベル要素となれるものをすべて選択してください。
|
|||
(Q2) 次のXSLTスタイルシートが処理されるとき、最初に実行されるテンプレートはどれでしょう。
|
○今回の試験対策のポイント
- 実体宣言
- 実体の種類
- 実体宣言の記述形式
- 内部一般実体
- 外部一般実体
- パラメータ実体
- 外部解析対象外実体
- 記法宣言
○今回の学習内容で出題範囲となる仕様
○今回の学習内容で実機確認を行うときに役立つフリーツール
- Internet Explorer 6.0 SP1 以上
- MSXML
Parser 3.0 Service Pack 2 Release
※ 別途、Xmlinst.exe Replace Mode Toolが必要になる場合あり(詳細は、Microsoft XML Parser Version 3.0 Releaseの新機能をご参照ください)
○今回の学習内容で参考になる@ITの記事
- 技術者のためのXML再入門 第5回 XML文書のカタチを決めるDTD
- やさしく読む「XML 1.0勧告」 第10回 XMLの難物、DTDとパラメタ実体参照に挑む
- XMLを学ぼう 第4回 スキーマ言語「DTD」の機能と役割
- XMLを学ぼう 第5回 DTDを読んでみよう
- XMLの基礎を理解する10のポイント ポイント#3 XML宣言とDTDと本体
- Ask XML Expert DTDが必要なときとは?
○今回の学習内容で参考になるXML用語集 (@IT XML用語事典より)
(10)XSLTの基本構造を理解する |
連載:XMLマスターへの道 |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|