XMLマスターポイントレッスン
      ~ プロフェッショナル(アプリケーション開発)編 ~
第2回 DOM/SAXの基本仕様

インフォテリア株式会社  教育部 木村 達哉

前回は、XML技術者育成推進委員会が運営する「XMLマスター:プロフェッショナル(アプリケーション開発)」認定試験について、大まかな試験範囲を紹介しました。それを踏まえ、今回からは、同試験のポイントをセクションごとに例題を挙げて解説していきます。その初回となる今回は、セクション1の出題範囲であるDOM/SAXの基本仕様について説明します。

試験対象となるDOM/SAXのバージョン

セクション1のポイントに入る前に、まずXMLマスター試験の対象となるDOM/SAXのバージョンを確認しておきましょう。

DOMの出題範囲

XMLマスター試験で出題されるDOM関連の問題は、すべて「DOM Level 2」に基づいたものとなります。
DOM Level 2は、名前空間をサポートする「DOM Level 2 Core」や、スタイルシートをサポートする「DOM Level 2 Style」など、複数の仕様から構成されます。これらのうち、セクション1では、主にDOM Level 2 Coreに関する基本的な知識を問う問題が出題されます。ちなみに、セクション2、および6で出題されるDOM関連の問題は、DOM Level 2 Coreで定義された個々のインタフェースについての知識を問うものとなります。

SAXの出題範囲

一方、XMLマスター試験で出されるSAX関連の問題は、すべて「SAX 2.0」をベースにしています。SAX 2.0には、「SAX 2.0 Extensions」という拡張仕様がありますが、出題の中心となるのは、この拡張仕様を除いた部分です(ただし、SAX 2.0 Extensionsについても、基本的な内容を理解している必要はあります)。

セクション1のポイント

では、セクション1のポイントの解説に入りましょう。セクション1では、DOMとSAXの目的や特徴、API仕様に関する問題が出題されます。サンプル・コードを提示した問題はなく、すべて文章問題です。したがって、DOM/SAXの基本仕様を理解しておく必要があります。

セクション1の出題例――DOMの場合

DOM Level 2 Coreで定義されているほとんどのインタフェースは、実際のプログラミングでも頻繁に利用する、基本的なインタフェースばかりです。とは言え、中には使用頻度の低いインタフェース(Notation、Entity、EntityReferenceなど)も存在します。これらについては出題頻度も低いので、試験勉強の際にもあまり重視しなくてよいでしょう。もちろん、それらの概略はきちんと理解しておく必要がありますが、後は実務などでの必要に応じて理解を深める程度でよいと思います※1

さて、JavaでDOMプログラミングを行う場合、JAXP(Java API for XML Processing)を使用するケースが多くあります。しかし、XMLマスター試験で対象となる出題範囲は、あくまでもDOM Level 2です。したがって、試験でJAXP固有のAPIに関する知識が問われることはありません。

例えば、DOM Level 2では、XML文書の読み込みに関する標準的な手順が定められていません。一方、JAXPでは標準的な手順が定められていますが、試験では、XML文書の読み込み方法を問うような問題は出題されません。

セクション1の文章問題を解くためには、DOM Level 2のAPIで「できること」と「できないこと」を理解しておくことが重要です。ここで1つ、例を挙げてみましょう。次の2つの文章は、正しい内容を述べたものでしょうか。

①DOM Level 2では、要素ノード(Element)の名前(nodeName)を変更するためのメソッドが定義されている
②DOM Level 2では、属性名である文字列から属性ノード(Attr)を取得するためのメソッドが定義されている

まず、DOM Level 2には、要素ノードの名前を変更するためのメソッドはありません。したがって、①は誤った内容の文章です。DOM Level 2において、要素ノードの名前を変更したい場合は、あらかじめ別の名前の要素ノードを作成した後、元の要素ノードが持つ属性や子ノードなどの全情報を新しい要素ノードに移す必要があります※2

一方、②は正しい内容の文章です。②で説明しているメソッドに該当するのは、インタフェースElementのメソッドgetAttributeNodeです(名前空間を伴った属性から属性ノードを取得する場合は、メソッドgetAttributeNodeNSを使います)。

セクション1の文章問題では、こうした知識が問われます。それでは早速、セクション1で出題されるDOMに関する問題の例を見てみましょう。

●DOMの例題
次のメソッドのうち、DOM Level 2のインタフェースNodeで定義されていないメソッドを選択してください。

A. appendChild
B. getElementsByTagName
C. hasAttributes
D. replaceChild

●解答
B

●解説
選択肢BのメソッドgetElementsByTagNameは、インタフェースDocumentおよびElementで定義されているメソッドです。

※1  これはセクション1に限ったことではなく、セクション2および6でのDOM関連の問題についても同様のことが言える。
※2  DOM Level 3では、インタフェースDocumentに、①のような役割を持つメソッドrenameNodeが追加された。

セクション1の出題例――SAXの場合

  続いて、SAX関連のポイントについて説明します。まずは、SAXで定義されている各インタフェース/クラスを確認しておきましょう。SAX 2.0を構成するのは、次の3つのパッケージです(SAX 2.0 Extensionsを含む)。

●org.xml.sax
●org.xml.sax.helpers
●org.xml.sax.ext

  これらのパッケージ内に定義されたインタフェース/クラスのうち、主なものをその使用頻度とともに表1に示します。

表1:SAX 2.0の主なインタフェース/クラスとその使用頻度
インタフェース/クラス名 使用頻度
org.xml.sax.Attributes
org.xml.sax.ContentHandler
org.xml.sax.EntityResolver
org.xml.sax.ErrorHandler
org.xml.sax.Locator
org.xml.sax.XMLFilter
org.xml.sax.XMLReader
org.xml.sax.helpers.AttributesImpl
org.xml.sax.helpers.DefaultHandler
org.xml.sax.helpers.XMLFilterImpl
org.xml.sax.helpers.XMLReaderFactory
org.xml.sax.ext.LexicalHandler

  表1の中で、使用頻度が「高」となっているものは、通常のSAXプログラムなら必ず登場するような、ごく基本的なものばかりです。また、「中」となっているものは、用途に応じて使用します。さらに、「低」となっているものについては、使われる個所が以下のようにかなり限定されます。※3

●クラスAttributesImpl:インタフェースorg.xml.sax.XMLFilterを使用してXML文書を操作する際、属性値の変更や新しい属性の追加を行う場合に使用する
●クラスXMLFilterImpl:強力なフィルタリングを行いたい場合に、インタフェースXMLFilterと併用する
●インタフェースLexicalHandler:特定の用途(操作対象となるXML文書内に、文書型宣言があるかどうかを知りたい場合など)に使用する

  こうしたインタフェース/クラスを使用し、JavaでSAXプログラミングを行う場合には、JAXPを使用するケースが多いと思います。ただし、SAXプログラミングに関する問題でも、DOMプログラミングの場合と同様の理由で、JAXPに関する知識が問われることはありません。

  例えば、先にも述べたように、JAXPではXML文書を読み込む際の標準的な手順が定められています。ただし、SAX 2.0では、XML文書の読み込みに関して別の手順が定められており、試験で出題されるのはそれに関連した問題のみです。したがって、普段はJAXPを使ってXML文書の読み込みを行っている方も、一度はSAX 2.0で定められた手順を確認しておくとよいでしょう。

  なお、SAX 2.0で定められた手順とJAXPで定められた手順との間には、大きく異なるところがあります。SAX 2.0の手順でXML文書を読み込んだ場合、デフォルトで名前空間機能がオン(フィーチャhttp://xml.org/sax/features/namespacesにtrueを設定した状態)になります。一方、JAXPの手順でXML文書を読み込んだ場合は、デフォルトで名前空間機能がオフ(フィーチャhttp://xml.org/sax/features/namespacesにfalseを設定した状態)になります。このような違いを知ることは、試験対策としてだけでなく、実務を行ううえでも重要です。

  以上を踏まえ、セクション1で出題されるSAXに関する問題の例を見てみましょう。

●SAXの例題
  インタフェースorg.xml.sax.XMLReaderに対して、インタフェースLexicalHandlerによってハンドリングされるイベントを設定する方法として正しい記述を以下より選択してください。なお、インタフェースLexicalHandlerの実装クラスのオブジェクトを参照する変数名は、「lexHandlerImpl」であるものとします。

A. インタフェースXMLReaderのメソッドparseを実行する前に、XMLReaderオブジェクトに対してsetLexicalHandler(lexHandlerImpl);を実行する
B. インタフェースXMLReaderのメソッドparseを実行する前に、XMLReaderオブジェクトに対してsetFeature("http://xml.org/sax/properties/lexical-handler", true);を実行する
C. インタフェースXMLReaderのメソッドparseを実行する前に、XMLReaderオブジェクトに対してsetProperty("http://xml.org/sax/properties/lexical-handler", true);を実行する
D. インタフェースXMLReaderのメソッドparseを実行する前に、XMLReaderオブジェクトに対してsetProperty("http://xml.org/sax/properties/lexical-handler", lexHandlerImpl);を実行する

●解答
D

●解説
  この問題は、インタフェースXMLReaderに対するイベント設定を例にとり、プロパティ全般の設定方法を理解しているかどうかを問うものです。

  SAXプログラミングでプロパティを設定するには、メソッドsetPropertyを使用します。同メソッドは、第1引数に設定対象のプロパティ名を、第2引数に設定する値を指定して呼び出します。例題のように、インタフェースLexicalHandlerによってハンドリングされるイベントを設定するには、メソッドsetPropertyの第1引数に「"http://xml.org/sax/properties/lexical-handler"」を、第2引数にインタフェースLexicalHandlerの実装クラスのオブジェクトを指定します。よって、正解は選択肢Dとなります。

  なお、選択肢AにあるsetLexicalHandlerというメソッドは存在しません。また、選択肢BのメソッドsetFeatureは、SAXプログラミングにおいて、フィーチャを設定する場合に使用するメソッドです。

※3  その他のインタフェース/クラスについては、概要をひととおり把握したうえで、後は実務の中で理解を深めていけばよいだろう。こうした出題傾向は、セクション1に限らず、セクション2および6で出題されるSAX関連の問題でも同様のことが言える。


ページトップへ▲

XMLマスターポイントレッスン ~ プロフェッショナル(アプリケーション開発)編 ~ 記事一覧へ戻る

HOMEへ戻る