ヒント: SAXパーサのセットアップ

SAXパーサのプロパティと機能を使う

Comments

Javaを使ってXMLを処理するには幾つかの方法があります。というのは、複数のAPIが利用可能であるためで、APIのうちの多くはテキスト文書から行を読み込むぐらい簡単にXMLを処理できます。DOMはツリー・ベースのAPIで、メモリ内にXMLの木構造を展開するので、GUIやエディタなどには最適です。SAXはストリーム・ベースのAPIで、文書のデータを得ることだけが必要な高性能アプリケーションに適しています。このシリーズでは、基本的なポイントから始めて、JavaでXMLを扱う方法をご案内して行きます。その過程で、多くの専門家でさえ知らないようなたくさんの秘訣について学ばれることでしょう。既にXMLの経験があるあなたにもこの記事は役に立つことでしょう。

まずはSAX (Simple API for XML) を取り上げます。このAPIはJavaのXML APIの中ではおそらく使いこなすことが最も困難ですが、最も強力なものでもあります。その上、他のほとんどのAPIの実装 (JDOM、dom4jなどのようなDOMパーサ) は、部分的にSAXパーサを基にしています。SAXを理解することは、XMLおよびJava言語で行う他のすべてに関して有利に働くでしょう。今回のヒントでは特に、SAXパーサのインスタンスを取得し、パーサの基本的な機能とプロパティを設定する方法についていくつか紹介したいと思います。

注:みなさんがApache Xerces-J (リンクに関しては参考文献を参照) などのSAX準拠のパーサをダウンロードされていることを前提にしています。Apacheのサイトには設定方法についての多くの情報がありますが、基本的には、ダウンロードしたJARファイルをCLASSPATHで指定した位置に配置するだけです。以降の例では、パーサが使用可能であることを想定しています。

パーサの取得

SAXの処理は、パーサのインスタンスを取得することから始まります。SAXでは、パーサがorg.xml.sax.XMLReaderクラスのインスタンスによって表されます。これに関しては、前回のヒント (「ヒント: SAXでベンダー非依存性を実現する」参考文献を参照してください) で詳細に説明しましたので、今回はあまり説明しません。リスト1では、ベンダー依存のコードを書くことなく、新しいSAXパーサのインスタンスを取得する適切な方法を示しています。

リスト1.SAXパーサのインスタンスの取得
// Obtain an instance of an XMLReader implementation from a system property
XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();

この方法を用いるには、ロードしたいパーサのクラス名をシステム・プロパティorg.xml.sax.driverにセットする必要があります。ここでセットするクラス名は、ベンダー固有のものとなります。つまり、Xercesであれば、org.apache.xerces.parsers.SAXParserとなります。次のように、Javaコンパイラーの-Dスイッチで引数として指定します。

java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser some.sample.Class

もちろん、指定したクラスが、CLASSPATH 配下に存在している必要があります。

機能

パーサのインスタンスを取得したら、それを設定する必要があります。ここでの設定は、XMLの構造やエラーなのか正常なのかを解析するための設定と同じではないことに注意してください。その代わり、ここでの設定はどのように振る舞うべきかをパーサに伝えるためのプロセスです。妥当性検証をオンにしたり、名前空間チェックをオフにしたり、エンティティーを展開したりできます。これらの振る舞いは、特定のXML文書には全く依存せず、この新しいパーサ・インスタンスに対して設定されます。

注:心配性の方のために(当然これを読んでいるあなた以外の・・・)、当然のことながら、エラー・ハンドリングなどにもきちんと対処していくつもりです。しかし、それらのテーマは今後のヒントで取り上げられることですので、しばらくお待ちください。今回は、機能 と プロパティ の設定に専念してください。

機能とプロパティの2つの方法でパーサを設定することができます。機能は、妥当性検証のような特定の機能のオン/オフに使用します。プロパティは、文書全体の妥当性を検証するスキーマの位置など、パーサが使用する特定の項目に値をセットする際に使用します。まずは機能について説明し、次のセクションでプロパティについて説明します。

当たり前のようですが、機能は、setFeature() と呼ばれるパーサのメソッドで設定されます。構文はリスト2のようになります。

リスト2. SAXパーサの機能を設定する
// Obtain an instance of an XMLReader implementation from a system property
XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader(); 
String featureName = "some feature URI";
boolean featureOn = true;
try {
  parser.setFeature(featureName, featureOn);
} catch (SAXNotRecognizedException e) {
  System.err.println("Unknown feature specified: " + e.getMessage());
} catch (SAXNotSupportedException e) {
  System.err.println("Unsupported feature specified: " + e.getMessage());
} catch (SAXException e) {
  System.err.println("Error in setting feature: " + e.getMessage());
}

これは一目瞭然です。ポイントはSAXパーサで利用可能な共通の機能を把握しておくことです。機能はそれぞれ特定のURIで識別されています。これらのURIの一覧はSAXのWebサイトにおいてオンラインで確認可能です(参考文献を参照してください)。最も一般的な機能は妥当性検証および名前空間の処理です。リスト3は、この2つの機能を両方ともセットしている例です。

リスト3. いくつかの共通機能
// Obtain an instance of an XMLReader implementation from a system property
XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader(); 
try {
  // Turn on validation
  parser.setFeature("http://xml.org/sax/features/validation", true);
  // Ensure namespace processing is on (the default)
  parser.setFeature("http://xml.org/sax/features/namespaces", true);
} catch (SAXNotRecognizedException e) {
  System.err.println("Unknown feature specified: " + e.getMessage());
} catch (SAXNotSupportedException e) {
  System.err.println("Unsupported feature specified: " + e.getMessage());
} catch (SAXException e) {
  System.err.println("Error in setting feature: " + e.getMessage());
}

パーサには幾つかの標準的なSAXの機能がありますが、それらはベンダーが固有の機能を自由に追加することができることに注意してください。例えば、ApacheのXerces-Jには、動的な妥当性検証、および致命的エラーに遭遇した後に処理を継続する機能が追加されています。機能に適切なURIを知るために、パーサ・ベンダのドキュメントを調べてください。

プロパティ

機能が理解出来れば、プロパティを理解することは簡単です。機能ではboolean値をプロパティではオブジェクトを引数に指定すること以外は機能とプロパティは全く同じように記述できます。リスト4に示すようにsetProperty() メソッドを使用してプロパティを設定します。

リスト4. SAXパーサのプロパティをセットする
// Obtain an instance of an XMLReader implementation from a system property
XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader(); 
String propertyName = "some property URI";
try {
  parser.setProperty(propertyName, obj-arg);
} catch (SAXNotRecognizedException e) {
  System.err.println("Unknown property specified: " + e.getMessage());
} catch (SAXNotSupportedException e) {
  System.err.println("Unsupported property specified: " + e.getMessage());
} catch (SAXException e) {
  System.err.println("Error in setting property: " + e.getMessage());
}

ここでもエラー処理の方法は同じです。したがって、双方の設定オプション間でコードを簡単に複写することができます。機能と同様に、SAXは標準的なプロパティを提供しており、ベンダー独自の拡張が可能です。共通のSAX標準プロパティでは、字句ハンドラ と 宣言ハンドラ (今後のヒントでこの2つのハンドラについて解説する予定です) を設定することができます。Apache Xercesのようなパーサでは、入力バッファ・サイズや妥当性検証で使用する外部スキーマの位置指定などができるように拡張しています。リスト5は動作するいくつかのプロパティを示しています。

リスト5. いくつかの共通プロパティ
// Obtain an instance of an XMLReader implementation from a system property
XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader(); 
try {
  // Set the chunk to read in by SAX
  parser.setProperty("http://apache.org/xml/properties/input-buffer-size", new Integer(2048));
  // Set a LexicalHandler
  parser.setProperty("http://xml.org/sax/properties/lexical-handler", new MyLexicalHandler());
} catch (SAXNotRecognizedException e) {
  System.err.println("Unknown feature specified: " + e.getMessage());
} catch (SAXNotSupportedException e) {
  System.err.println("Unsupported feature specified: " + e.getMessage());
} catch (SAXException e) {
  System.err.println("Error in setting feature: " + e.getMessage());
}

機能およびプロパティについて理解すれば、パーサに殆ど何でも行わせることができます。一度この方法でパーサの設定を理解すれば、次回のヒント (基本的なコンテンツ・ハンドラの作成について解説する予定) のための準備は万端です。それでは、次回をお楽しみに


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


関連トピック

  • XML仕様に関するありとあらゆる詳細を、W3Cサイトでご覧ください。
  • XML.comの annotated XMLをご覧ください。
  • SAXプロジェクト・ホームページをご覧ください。
  • SAX標準の機能およびプロパティ一覧を参照してください。
  • スキルアップのために、『Java and XML』(Brett McLaughlin著、O'Reilly and Associates) をお読みください。
  • Apache の Web サイトで、Xerces-Jに関する詳細を調べ、最新のバージョンをダウンロードするようにしてください。
  • developerWorksの XML ゾーンには、XMLに関するさらに多くの記事があります。

コメント

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML
ArticleID=242513
ArticleTitle=ヒント: SAXパーサのセットアップ
publish-date=07022003