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

第8回 XMLマスター模擬試験:DOM

福内 かおり・木村 達哉
2003/7/9


本記事は、@ITハイブックスシリーズ『XML技術者認定試験「XMLマスター ラーニングブック」−ベーシック 編−』(技術評論社)から、許可を得て一部を転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。

 XMLマスターの模擬問題を中心にお届けしてきた「特別編」は今回が最後です。次回からは、通常の解説に戻ります。模擬問題は@ITハイブックスシリーズ『XML技術者認定試験「XMLマスター ラーニングブック」−ベーシック 編−』から抜粋してお届けしていきます。

 今回は、第6章「DOM」から、DOMに関連する問題を紹介します。

問 題 06-004 DOMツリー

(Q) DOMツリーを説明する次の記述の中で、間違っているものを選択してください。(単一選択)

[A] Documentノードは、Elementノードを子に持つ。
[B] Elementノードは、Attrノードを子に持つ。
[C] Elementノードは、Commentノードを子に持つ。
[D] Documentノードは、Textノードを子に持つことはない。

解説

 DOMツリーのモデル化の様子は、下記の表に従います。

表 DOMツリーのモデル化

 表中のクリーム色で背景色を付けた各ノードが、DOMツリーを構成するノードになります。DOMツリーのトップは、必ずDocumentノードです。このDocumentノードは、表中に示された4種のノードを子に持つ可能性がありますが、Textノードを子に持つことはありません。それはXMLの構文規則によるものであって、DOM特有というわけではありません。XMLでの文字列は必ずルート要素内部で出現し、それ以外で出現することはありません。また、ルート要素が1つというのもXMLのルールです。

 例えば、次のようなXML文書がDOMによってモデル化されると、DOMツリーには1つのDocumentノードと3つのElementノードと3つのtextノードが含まれます。DOMは、これらのオブジェクトを参照したり、編集を行うためのAPIを定義しています(下図)。

図 DOMツリー

 そして表中でのElementノードとAttrノードの関係にも注目してください。一見、AttrノードはElementノードの子ノードであるかのように考えてしまいそうですが、実はそうではありません。こちらもDOM特有というわけではなく、XMLの一般的な考え方です。属性は単独で存在することはなく、いつも必ず要素に従属するものです。そこで属性は、要素のアトリビュート(プロパティ)という位置付けになります。そして、DOMでもAttrノードはElementノードのアトリビュートとして存在し、DOMツリーを構成するノードにはなりません。

 また、Entity、NotationノードもDocumentTypeノードのアトリビュートです。

EntityReferenceノードは、それが外部一般解析対象実体を指している場合、表中のようなさまざまなノードを子に持つことがあります。

POINT

DOMツリーを構成するノードは、Document、Comment、ProcessingInstruction、DocumentType、Element、Text、CDATASection、EntityReferenceの8種類のノードのみです。
Attrノードはこれに含まれず、Elementノードのアトリビュートという位置付けになります。
Documentノードは、必ずトップの位置に1つだけ存在します。

正解 B

 

問 題 06-005 代表的なアトリビュート

(Q) DOMのアトリビュートを説明する次の記述の中で、間違っているものを選択してください。(単一選択)

[A] あるノードの名前を表す文字列を取得することのできるアトリビュートはnodeNameである。

[B] あるノードが持っている文字列を取得することのできるアトリビュートはnodeValueである。

[C] あるノードの子ノードをまとめて取得することのできるアトリビュートはchildNodesである。

[D] DocumentノードのrootElementアトリビュートを使用すると文書内のルート要素を取得できる。

解説

 DOMでは、インターフェイスごとに使えるメソッドやアトリビュートを定義していますので、そのメソッドやアトリビュートを用いることによって、実際のプログラミングが行われます。

 ここでは、DOMの代表的なアトリビュートを見ましょう。

 ベーシックの出題範囲では、ごく基本的なものに限られますので、ここにあげた程度のものをしっかりと覚えてください。

nodeNameアトリビュート
nodeNameアトリビュートは、あるノードの名前を表す文字列を取得することができます。例えば、animal要素であれば“animal”文字列を取得できます。対象ノードが名前を持たないノードの場合、固定文字列が返ってきます。例えば、Textノードなら “#text”です。

nodeValueアトリビュート
nodeValueアトリビュートは、あるノードが持っている文字列を取得することができます。例えば、Textノードの文字列が「りす」ならば、“りす”文字列を取得できます。対象ノードが文字列値を持たないノードの場合、nullが返ってきます。例えば、Elementノードならnullです。

ここで注意したいのは、Elementノードが次のような状態であったとしても、nullが返ってくるという点です。

<animal>りす</animal>

このようなとき、Elementノードが文字列を直接持っているわけではなく、Elementノードは子ノードとしてTextノードを持ち、Textノードが「りす」文字列を持ちます(つまり、TextノードのnodeValueで“りす”文字列を取得できます)。

childNodesアトリビュート
childNodesアトリビュートは、あるノードの子ノードをまとめて取得することができます。この場合の戻り値は、複数のノードを含むコレクションとなり、コレクション内の各ノードはインデックス番号を持っていますので、そのインデックス番号により各ノードを処理できます。子ノードが存在しない場合は、何もノードを含まないコレクションが返ってきます。

 上記の「nodeName」、「nodeValue」、「childNodes」アトリビュートは、問題06-003「DOMのインターフェイス」で解説したすべてのノードにおいて、共通的に使用できるアトリビュートです。

 Elementノードで「attributesアトリビュート」を使用すると、そのElementノードが持っているAttrノードの集合を含むコレクション(順序を維持せず名前で管理されるマップタイプです)を取得できます。

 Documentノードの「documentElementアトリビュート」を使用すると、文書内のルート要素(文書要素ともいいます)を取得することができます。

 DOMのその他のアトリビュートとしては、以下のようなものもあります。

ノードの種類を表す数値を返すもの
兄弟ノードや親ノードを返すもの
Attrノード特有のもの
Textノードなどで文字数を返すもの

POINT

 DOMの主なアトリビュートには、次のようなものがあります。

DOMツリーの各ノードで共通のアトリビュート:
nodeName、nodeValue、childNodes

DOMツリーの各ノードで共通のアトリビュート:
nodeName、nodeValue、childNodes

Elementノードで使えるアトリビュート:
attributes
実はこのattributesアトリビュートはDOMツリーの各ノードが持っているアトリビュートなのですが、Elementノード以外のノードでは、すべてnullが返ってきます。したがって、実質的にはElementノードのみで有効です。
Documentノードのみで使えるアトリビュート:
documentElement

KEYWORD

コレクション
いくつかのプログラミング言語では、複数のデータを管理するものとしてコレクションをサポートします。コレクションはその性質によって数種類考えられますが、中でも順序を維持しインデックス番号で処理されるリストタイプと、順序を維持せずキーとなる名前で処理されるマップタイプが代表的です。DOMのchildNodesアトリビュートは、リストタイプのコレクションを返し、attributesアトリビュートはマップタイプのコレクションを返します。

正解 D

 

問 題 06-006 代表的なメソッド

(Q) 要素名を表す文字列を引数として与え、その名前のElementノードの集合を取得することのできるDOMのメソッドを選択してください。(単一選択)

[A] getElements
[B] getElementsTagName
[C] getElementsByName
[D] getElementsByTagName

解説

 ここでは、DOMの代表的なメソッドを見ましょう。

getElementsByTagNameメソッド
DocumentノードかElementノードで使用することができ、引数として与えられた文字列の名前のElementノードをコレクションとして取得することができます。

removeChildメソッド
removeChildメソッドは、あるノードの子ノードを削除することができます(下図)。


図 removeChildメソッド

 図のようなとき、次の命令を実行することによって、「りす」文字列を含むanimal要素を削除することができます。

変数A.removeChild(変数B)

 このとき変数Bがエレメントノードを参照しているわけですが、あるエレメントノードを削除すると、そのエレメントノードの子孫ノードも一緒になくなります。

appendChildメソッド
appendChildメソッドは、ノードを移動します(下図)。

図 appendChildメソッド

 図のようなとき、次の命令を実行することによって「りす」文字列を含むanimal要素がzoo要素の子ノードの位置に移動します。

変数A.appendChild (変数B)

 このappendChildメソッドが「append」らしい振る舞いをするには、ノードの生成処理とともに用います(下図)。

図 ノードの生成

 図のようなとき、まず次の2行の命令を実行することによって、2つのノードが生成されます。「createElementメソッド」はElementノードを生成し、「createTextNodeメソッド」はTextノードを生成します。createElement、createTextNodeメソッドは必ずDocumentノードで使用し、また生成しただけでは位置がまだ不定である点に注意します。

変数B = 変数A.createElement ("animal")
変数C = 変数A.createTextNode ("りす")

 そして、次の2行の命令を実行します。1行目により「りす」Textノードがanimal要素に「append」され、2行目によりanimal要素がdata要素(これはこの文書のルート要素です)に「append」されます。appendChildメソッドは、常に子ノード群の一番後ろの位置にノードを挿入します。これでノードが生成され、所定の位置に挿入できましたが、やはりこちらも、appendChildメソッドの役割は実質的には移動ということになります(下図)。

変数B.appendChild (変数C)
変数A.documentElement.appendChild (変数B)

図 ノードの生成とappendChildメソッド

 DOMのその他のメソッドとしては、以下のようなものもあります。

ノードを置き換えるもの

ノードをコピーするもの

解説した以外のノードを生成するもの
ElementノードでAttrノードを操作するもの
Textノードなどで文字列を操作するもの

POINT

 DOMの主なメソッドには、次のようなものがあります。

DOMツリーの各ノードで共通に使えるメソッド:
removeChild、appendChild

DocumentノードとElementノードで使えるメソッド:
getElementsByTagName

Documentノードのみで使えるメソッド:
createElement、createTextNode

正解 D

XML技術者認定試験「XMLマスター ラーニングブック」−ベーシック 編−

 本記事は@ITハイブックスシリーズ「XML技術者認定試験「XMLマスター ラーニングブック」−ベーシック 編−」(技術評論社)から、一部の内容を編集し転載したものです。本書の詳細は「@ITハイブックス」サイトでご覧いただけます。

(9)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 記事ランキング

本日月間