XML & Java

Revised: Oct./05th/2003

XML仕様の概要

XML文書がテキストであること

XMLは、マークアップ言語を記述する規則を定めています。マークアップ言語とは、タグと呼ばれる文字列でデータを修飾して、階層構造のデータを記述する方法です。ご存じない方には、「なんじゃそりゃ??」だと思いますが、HTMLをご存知であれば、あれのことです。要するに、テキスト文書の記述フォーマットの一つです。

次の文書は、文字コードをJIS (ISO-2022-JP)で保存すれば、XML文書として正しいものです。XML文書はテキストエディタで作成/編集/保存できる、要するにテキストなのです。

<?xml version="1.0" encoding="iso-2022-jp"?>
<root>
	<element01>element01の内容</element01>
	<element02>
		element02要素の内容
		<element03>element03要素の内容</element03>
	</element02>
	<element02 attl01="attl01属性の値">element02要素の内容</element02>
</root>

B2BとB2C

XML文書はテキスト・エディタで操作できるのですが、注目されているのは、機械処理を対象にして設計されていると言う点です。人間がテキストエディタで、タイポ(誤植)と戦って記述するようなテキスト文書であれば、企業システムにおいて、さほど有用ではありません。作るのは人間であり、受け取る側も人間であれば、余程酷くなければ、少々の誤植は問題なく推測で解決できます。しかし、作るのは人間であっても、受け取り手が機械であった場合、推論ロジックを実装するのは大変であり、ワークの無駄遣いともいえます。

前者をB2C (Business to Customer/Consumer)と呼び、後者をB2B (Business to Business)と呼んでいます。eコマース(電子商取引)が真に力を発揮するのは、途中に人間が介在しない、自動化されたB2Bなのです。ここにターゲットを向けて設計されたのが、XMLなのです。

XML文書は、機械処理が容易であること、テキスト文書であること、UNICODEをサポートすることなどから、汎用的なデータ記述フォーマットとして注目されています。

XMLプロセッサ

JavaなどのアプリケーションからXML文書を操作するには、XML文書との間に、XMLプロセッサ(パーサ)と呼ばれる処理系をはさみます。共通処理を部品化して、アプリケーションは適用業務(ビジネスロジック)の実装に専念させようとする思想です。背景には、HTMLをパーズしてレンダリングする処理系であるHTMLブラウザが、極めて複雑高度なものに変貌していった反省が横たわっています。XML処理系は、制約の検証とか、いろいろやってくれるので、アプリケーション側からは、XMLプロセッサのAPIを通して、抽象化(モデル化)されたXML文書を触れば良いことになるので、アプリケーション側でやらなければならないことが少なくなります。

また、HTMLと比べると、XMLは、例外を含めて規則が厳重なので、XMLプロセッサの設計が単純になります。共通部品を、堅牢、高速に実装できるようにするためです。アプリケーションは、XMLプロセッサを操作するためのAPIとして、DOM, SAX, JAXPなどを利用することになります。

JavaのXML文書処理モデル
図:JavaのXML文書処理モデル

本稿の流れ

本稿では、XMLの基礎と、DOM/SAX及びJAXPを紹介します。XMLプロセッサの実装としては、Apache XMLプロジェクトXerces2を使います。

XMLとは、マークアップ言語を記述する規則を決めたものです。XMLの規則に従った文書は整形式であるといわれ、XMLプロセッサの処理対象となります。マークアップで使える要素名、属性名、その値や構文などをスキーマと呼び、複数のスキーマを名前空間に関連付ける事で、異種のスキーマが混在した文書を簡単に記述できるようになります。

スキーマの記述方法としては、DTDとXMLSchemaを紹介します。特に、XMLSchemaはそれ自体がXML文書として設計されたマークアップ言語となっています。スキーマに適合する文書は、妥当であると呼ばれ、XML文書の妥当性検証は、XMLプロセッサの重要な仕事の一つです。XMLプロセッサが、整形式の判定と妥当性検証を厳密に行った結果をアプリケーションが受け取ると言う仕組みをとれば、アプリケーション側では、対象となるXML文書の処理に専念できるため、開発効率がぐっと高まることになります。

アプリケーションがXMLプロセッサとやり取りするためのAPIとしては、DOMとSAXを紹介します。また、それらを抽象化する上位のAPIとしてJAXPも紹介します。

SAX (Simple API for XML)は、メーリングリストXML-DEVのコラボレーションにより誕生し、国際的な標準化団体による仕様ではないにも関わらず、デファクト・スタンダード(事実上の標準、業界標準)となっているAPIです。SAXは、Java用のイベント駆動型の軽量なAPIであり、ランダムアクセスや構造の変更といった要件には弱いものの、逐次的な処理が可能であれば、メモリ消費量、実行速度の点で優れています。

DOM (Document Object Model)は、WWWの事実上の標準化団体であるW3C (World Wide Web Consortium)にて正式に承認された仕様です。W3Cで「勧告(Recommendation)」と呼ぶ正式な仕様の一つです。DOMは、プログラミング言語に依存しないAPIであり、XML文書に対応するツリー構造を静的にメモリ上に保持して、ランダムアクセス可能なAPIです。構造に対する変更や、プロセッサによる解析結果にランダムアクセスする必要があれば、DOMによってすっきりとしたアプリケーション・コードが記述できます。

JAXPは、Javaの標準パッケージに含まれ、DOM/SAXのAPIを抽象化して、Javaアプリケーションに対して、XMLプロセッサの実装に依存しない普遍的なAPIを提供します。JAXPのみに準拠すれば、XMLプロセッサの実装に依存しない汎用的なコードが記述できるようになります。

SAX/DOM及びJAXPが、アプリケーションでXML文章を利用するときの基盤的なアーキテクチャとなります。他にも、DOMをJavaに特化したJDOMや、処理系の実装に強く依存したXNI (Xerces Native Interface)などのAPIも多数存在します。

後半では、DOM/SAXのAPIの上位で利用する仕様XPath, XSLTについて紹介します。



Copyright © 2003 SUGAI, Manabu. All Rights Reserved.