XML関連Javaテクノロジーの現在

【後編】 Apache XML Projectのツール群

Xalan、Cocoon、Apache SOAP、JAXP、JAXB……このどれもがXMLに対応したJavaのツールやAPIの名前だ。XMLに対応したJavaのAPIや実装は、いまや数多くある。これらはそれぞれどんな特徴を持ち、どのような用途に適しているのか。使うときの注意点はなにか。本記事ではそうした情報をまとめて解説する。

原田洋子
フォーディーネットワークス(株)
2001/12/27

 Apache XML Project -- http://xml.apache.org/

 Apache XML Projectは、Apache Software Foundationの中のXMLプロジェクトである。このプロジェクトへは個人、団体が標準的なAPIやツールを提供してきたため、すでにXMLプロセッサが3種類あるなど、さまざまなツールが用意されている。主なものとして下記の7つが挙げられる。

  • Xerces Java 1
  • Xerces Java 2
  • Crimson
  • Xalan Java 2
  • Apache SOAP
  • Cocoon 1
  • Cocoon 2

 前回「XML関連Javaテクノロジーの現在」で紹介したJAXPやJAXBなどは、その名称がAPIそのものを指す場合とAPIの実装までも含めたものを指す場合の両方があった。今回紹介するのは、Apache XML ProjectによるAPIの実装と、そのAPIを使って作られたツールである。それぞれを詳しく見ていくことにしよう。

Xerces Java 1 (IBM XML4Jの後継XMLプロセッサ)

 IBMのXMLプロセッサであるXML for Java(XML4J)がこのプロジェクトに提供され、名称が Xerces(「ザーシズ」と読むことが多い)に変わった。XML文書をパースする機能とファイルなどへの出力機能があるが、XSLTによる変換機能はない。XML 1.0、XML Namespaces、XML Schema 1.0、SAX 2、DOM Level 2のサポートに加え、バックワードコンパチビリティのため、DOM Level 1、SAX 1をサポート。さらにJAXP 1.1(JSR-63)のうち、TrAXを除く実装も提供している。XercesはHTMLやWMLも扱えるほか、Regex(正規表現を扱うAPI)、シリアライズなど多機能な実装である。

 現在、最新バージョンは1.4.4でアーカイブはxerces.jar1つだけで構成されている。ただし多機能ゆえに、アーカイブのサイズは大きい。

Xerces Java 2 (新たに書き起こされたXMLプロセッサ)

 Xerces Java 1同様、XMLプロセッサである。サポート対象もXML 1.0、XML Namespaces、XML Schema 1.0、SAX 2、DOM Level 2、JAXP 1.1(JSR-63ただしTrAX を除く)と、ほぼ同程度となっている。この実装はXML4Jの後継ではなく、モジュール化、メンテナンス性向上を考慮して新規にコードを書き起こした新しいXMLプロセッサである。現在、最新バージョンは2.0.0 beta3で、アーカイブはやはりxerces.jar1つだけで構成されている。

Crimson (サン・マイクロシステムズが提供したXMLプロセッサ)

 サン・マイクロシステムズがApacheプロジェクトに提供したXMLプロセッサである。サポート対象はXercesとほぼ同様の、XML 1.0、XML Namespaces、SAX 2、DOM Level 2、JAXP 1.1(JSR-63ただしTrAX を除く)となっている。CrimsonはXMLパーサの機能を提供するのみのシンプルな実装である。このため、アーカイブであるcrimson.jarはxerces.jarの約9分の1のサイズしかない。サーバサイドでの利用ならxerces.jarのサイズが気になることはないだろうが、クライアント側など小さいサイズが要求される環境では、Crimsonが選択肢に入ってくるだろう。

 現在は、サン・マイクロシステムズのサイトで配布されているJAXP 1.1.xの実装に使われているものと同じものがApacheのサイトでも配布されている状況であるが、将来はXerces Java 2に統合される予定である。

Xalan Java 2 (XSLTプロセッサ)

 XSLT 1.0をサポートしているXSLTプロセッサである。JAXP 1.1(JSR-63)のうちTrAX API であるjavax.xml.transformation、javax.xml.transformation.dom、javax.xml.transformation.sax、javax.xml.transformation.streamパッケージの実装を提供している。後述のCocoonは、基本的にXML文書を読み込み、XSLTによる変換を行うが、TrAX APIを使ったプログラミングを行うと、ダイナミックに生成したDOMツリーに直接スタイルを与えて変換できる。

 サン・マイクロシステムズがJava XML Packで提供されているXalanと同じものではなく、こちらのサイトで配布されているアーカイブにのみ存在するクラスがある。アーカイブ構成も、こちらのXalanは、APIだけのxml-apis.jarと、実装のxalan.jarの2構成である。また、便宜性が考慮されているためと思われるが、Xerces 1.4.3のアーカイブxerces.jarが同梱されて配布されている。

Apache SOAP (Apache上に実装されたSOAP)

 XMLメッセージの送受信を行うためのAPIが用意されており、IBM SOAP4Jがこのプロジェクトに提供したものが基になっている。SOAP 1.1とSOAP Messages with Attachmentの実装である。現時点ではJAXM の仕様(JSR-67)との関連はないが、JSR-67が決められるよりも早い時期に実装がリリースされて広く使われているため、実質的にはJavaでのSOAPといえばこのApache SOAPを指している。

 最新バージョンは2.2であり、Servlet API 2.2をベースにしている。Apache SOAPを動かすにはサーブレットコンテナのほか、DOM2に対応しているXMLプロセッサ、JavaMail、JavaBeans Activation Frameworkが必要である。Apache SOAP 2.2の場合、SOAP以外のアーカイブは同梱されていないので別途用意する必要があるが、サーブレットコンテナにそれらのアーカイブが含まれていることもある。

 実際、Tomcat 4.0.1には上記のツールがすべてそろっている。ところが、Tomcat 3.2.3に含まれているXMLプロセッサはDOM 2をサポートしていないバージョンなので、そのままではApache SOAPを動かせない。コンテナのXMLプロセッサを入れ替える必要がある(Tomcat 3.2.4付属のXMLプロセッサはDOM 2をサポートしている)。サーブレットコンテナについて調べてから、足りないものを用意するといいだろう。

Cocoon 1 (XML文書のパブリッシングツール)

 Cocoonはパブリッシングツールと呼ばれるもので、サーバ側でXML文書にXSLTによりスタイルを与え、HTML、XHTML、WMLなどに変換したうえで配信するツールである。リクエストヘッダに含まれるUser-Agentフィールドをチェックして、適用するスタイルシートを自動的に変更する機能もある。サーバサイドですべての処理を実行するので、クライアント(Webブラウザ)にXSLT変換処理の機能が要求されない点が便利だ。

 Xalanと違い、基本的にプログラミングを必要とせず、XML文書とXSLTスタイルシートを記述するだけで十分である。一方、DOMプログラミングによりダイナミックな処理を施した文書は、一度ファイルに出力したうえで、Cocoonによって変換するという2段階の処理が必要になる。2段階の処理を避けたい場合はXSP(Extensible Server Pages)と呼ばれるJSPに似たCocoon独自のダイナミックなページ生成ツールを利用する手段も用意されているが、その場合にはプログラミングも必要になる。

 CocoonではXSL:FO(Formatting Object)を用いてPDF形式でレンダリングするプロセッサFOPを動かすこともできる。

 Cocoon は機能が豊富であるが、それらを利用するのに必要なAPIのバージョンが限定される傾向がある。Cocoon一式の中にはさまざまなAPIのアーカイブが含まれているため、ここにあるアーカイブを使うようにするといいだろう。

Cocoon 2 (機能強化が図られた新バージョン)

 Cocoon 1と同様に使用できるパブリッシングツールである。Cocoon 1との違いは、内部コードが大幅に書き換えられ機能強化が図られたほか、ベースとなるXMLプロセッサ、XSLTプロセッサが現状に即したバージョンまで上がったこと、サーブレットコンテナ上ですぐに動かせるWAR(Web Archive) 形式での配布になった、などがある。Cocoon 1は動くようにするための作業が単純ではなかったが、Cocoon 2はそれほど苦労しないのではないだろうか。ただし、WAR の中にXMLプロセッサが含まれているので、サーブレットコンテナ自身が持っているものとの組み合わせで問題が発生する可能性がある。この点については後述の「サーバサイドでのXML利用における注意」で触れるので、参照してほしい。

 XML/XSLTプロセッサアーカイブに含まれるパッケージ

 XMLの主なAPI/ツールの概要に触れたが、XMLプロセッサだけで4種類、XSLTプロセッサは、1種類ではあるが内容の違う2系統がある。これらは歴史的な経緯、利便性を考慮したなどの理由によるものであるが、より広い範囲のAPIをカバーするようになっているものが多い。このため、組み合わせて使おうとすると重複するパッケージがある。

 単体で動作するJavaアプリケーションではあまり大きな問題にはならないが、サーバサイドで利用する場合、カスタムクラスローダが使われる環境にあることも手伝って、複雑な問題になりがちである。そこで、特に問題になりがちなAPI部分(実装を除く)についてどのアーカイブにはどのパッケージが含まれているかをまとめておきたい。

Crimson(JAXP 1.1.3)
Apache Crimson 1.1.3
javax.xml.parsers
org.w3c.dom
org.xml.sax
org.xml.sax.ext
org.xml.sax.helpers

Xerces 1.4.4
javax.xml.parsers
org.w3c.dom
org.w3c.dom.events
org.w3c.dom.html
org.w3c.dom.ranges
org.w3c.dom.traversal
org.xml.sax
org.xml.sax.ext
org.xml.sax.helpers

Xerces 2.0.0
javax.xml.parsers
org.w3c.dom
org.w3c.dom.events
org.w3c.dom.html
org.w3c.dom.ranges
org.w3c.dom.traversal
org.xml.sax
org.xml.sax.ext
org.xml.sax.helpers

Xalan (JAXP 1.1.3)
javax.xml.transform
javax.xml.transform.dom
javax.xml.transform.sax
javax.xml.transform.stream
org.w3c.dom
org.w3c.dom.ranges
org.w3c.dom.traversal
org.xml.sax
org.xml.sax.ext
org.xml.sax.helpers

Apache Xalan 2.2.D14 (xml-apis.jar)
javax.xml.parsers
javax.xml.transform
javax.xml.transform.dom
javax.xml.transform.sax
javax.xml.transform.stream
org.w3c.dom
org.w3c.dom.css
org.w3c.dom.events
org.w3c.dom.ranges
org.w3c.dom.stylesheets
org.w3c.dom.traversal
org.w3c.dom.views
org.xml.sax
org.xml.sax.ext
org.xml.sax.helpers

Java 2 SDK 1.4.0 beta 3 (JDK 1.4)
javax.xml.parsers
javax.xml.transform
javax.xml.transform.dom
javax.xml.transform.sax
javax.xml.transform.stream
org.w3c.dom
org.w3c.dom.css
org.w3c.dom.events
org.w3c.dom.html
org.w3c.dom.stylesheets
org.w3c.dom.traversal
org.w3c.dom.views
org.xml.sax
org.xml.sax.ext
org.xml.sax.helpers

 以上を比較すると、Crimson、Xercesのみの場合にはパッケージの重複を気にする必要はあまりないが、Xalanを組み合わせる際には、どのアーカイブにあるクラスファイルが Java VM上にロードされたのかに注意しておきたい。場合によってはアーカイブ名を変えて、先にJava VMに読み込まれるようにしなければならないことがある。そのときは、

> jar tvf xalan.jar

のようにjarコマンドを実行して、どのようなクラスが含まれているかを確認するといいだろう。

 JDK 1.4に取り込まれている実装をそのまま使うのが最もトラブルが少ない方法といえるが、Xercesにしかない機能は多く、また、org.w3c.dom.rangeパッケージがないなど、すべてのXMLアプリケーションで使えるとはいえないのが現状である。

 JAXP 1.1はJREディレクトリの lib/jaxp.propertiesでXMLプロセッサのどの実装を使うかを指定できるので、そのようにして実装をXercesに変更することはできる。

サーバサイドでのXML利用における注意

 パッケージの重複はサーバサイドでは複雑な問題になるため、それについて触れておこう。Servlet API 2.1以降、実質的にはServlet API 2.2/JSP 1.1を実装したサーブレットコンテナであるが、このバージョンではWebアプリケーションの概念が導入された。これは各Webアプリケーションに違うクラスローダを適用することで、Java VM上で名前空間を分け、バーチャルホスティングに似た機能を提供するものである。通常、サーブレットコンテナではWebアプリケーションやオートリロードの機能を実現するために定義されたカスタムクラスローダが使われる。Javaではクラスローダもまたオブジェクトであり、ユーザーが定義できるようになっている。

 ところが、違うクラスローダが適用された場合、同じクラスであってもキャストできない、言い換えると、同一のものであると認識できないようになっている。このため、例えばjavax.xml.parsers.DocumentBuilderFactoryにブートローダ(システムクラスローダ)が適用され、Java VMにインスタンスが生成された状態で、あるWebアプリケーションがその中にあるcrimson.jarやxerces.jarからjavax.xml.parsers.DocumentBuilderFactory のインスタンスを取得しようとすると、こんどはカスタムクラスローダが適用されるのでClassCastExceptionが発生する。

 サーブレットコンテナの DD(Deployment Descriptor)はXML文書である。このため、これらのXML文書パースのため起動時に必ず、ブートローダによりjavax.xml.parsers.DocumentBuilderFactoryなどのインスタンスがJava VM上に生成され、staticなクラスとして存在する。staticなインスタンスはJava VMで使い回されるため、Webアプリケーションのカスタムクラスローダが適用されたインスタンスと相互参照ができないのである。

 この問題を回避するにはXML関連アーカイブをすべてサーブレットコンテナのブートローダが適用されるディレクトリに移動させるしかない。さらに、Webアプリケーション内のアーカイブが優先されるので、WEB-INF/lib以下から重複する可能性のあるアーカイブを削除しておかなければならない。

 また、サーブレットコンテナがcrimson.jarを参照するようになっているが、CocoonのXSPなど、Xercesが必要になるケース、Apache SOAPのようにDOM 2のサポートが必要なのにサーブレットコンテナがDOM 1しかサポートしていないXMLプロセッサを使っているケースもある。このような場合はサーブレットコンテナのXMLプロセッサを、よりサポート範囲の広いXerces 1.4.xと入れ替えるといいだろう。コンテナ起動時にワーニングが出ることがあるが、通常、コンテナの動作に問題はない。


 JavaによるXML関連API/ツールの現状を見てきたが、現在は大きな動きの中にあり、上述したパッケージの重複や不具合などが次第に解消されていくだろう。新たにリリースされる API や続々と追加されるツールなど、今後も目を離せない状況にある中で、これらをいかに使いこなしていくかが次の課題となるだろう。

■早くもJava XML Packの新版がリリース
 Java XML Pack Fall 01 bundleが11月中旬にリリースされたと前編で紹介したが、 12月19日にはWinter 01版がリリースされた。内容を見てみると、JAXM 1.0.1 Early Access 1(以下EA1)、JAXP 1.2 EA1、JAXR 1.0 EA、JAX-RPC 1.0 EA1が含まれている。Final ReleaseのAPIのみだったFall 01 bundleとは違い、すべてEarly Access 版となっている点が特徴だろう。

 Winter 01で注目したいのは、JAXPの実装がXerces+Xalanの組み合わせに変わった点である。特にXercesはCrimsonが統合されたXerces Java 2が採用されている。Winter 01は、目新しいものばかりを集めた興味深いパックであるが、これまでのツールとの互換性を考慮するとやや実用性に欠けるかもしれない。

 

Index
XML関連Javaテクノロジーの現在
  前編〜Java XML PackのAPI群
後編〜Apache XML Projectのツール群



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

注目のテーマ

HTML5+UX 記事ランキング

本日月間