レベル: 初級 Brett McLaughlin (brett@newinstance.com), Enhydra strategist, Lutris Technologies
2001年 6月 01日 Brett McLaughlinはこの記事で、SAXの妥当性検査機能を調べ、XML文書妥当性検査をオンまたはオフに切り替える方法を説明します。また、ErrorHandler インターフェースについても説明しています。このインターフェースを使用すると、ユーザーはアプリケーションで発生したエラーの通知を受け取って、その通知に基づいて処置を行うことができます。コード・サンプルでは、妥当性検査を要求する方法、およびSAXでエラー・ハンドラーを作成および登録する方法が示されています。
XML妥当性検査は、文書正しくを作成するための基礎となります。XML文書に意味を与えるかぎ (これはまた、妥当性検査の核心でもあります) は、その文書を支配する一連の制約の中にあり、また、それらの制約が守られることが確保されるということにあります。たとえば、エレメントpage は、(単一ページの内容を表示するときのように) 1つのpage エレメントだけが許される場合と、(数100ページもある小説のように) 多くのpage エレメントが許される場合とでは、意味が異なります。DTDまたはXMLスキーマと妥当性検査を行うパーサーとを合わせて使用すると、文書をアプリケーション間で使用できるようになります。SAX (Simple API for XML) を使用して、文書の制約を妥当性検査し、この意味を1つまたは複数のXML文書に提供することは簡単に行えます (参考文献を参照)。
XMLパーサーでは、妥当性検査は通常、デフォルトでオフになっています。これは、多くのXML文書作成者は制約事項を書き込まないため、妥当性検査をオフにしておくと実稼働環境で長時間がかかる処理を避けることができるためです。妥当性検査をオンにするには、明示的にそれを要求する必要があります。このヒントでは、SAX APIを使用してそれを行う方法を示します。SAXはイベント・ドリブンになっていますので、ユーザーは、妥当性検査中に発生したエラーの通知を受け、それに対して反応する必要があります。これは、SAXのErrorHandler インターフェースを使用して行うことができますので、その方法を示します。
SAXフィーチャーの設定
SAXフィーチャーの設定は、SAXで妥当性検査を行うために不可欠なものです。これは、SAX 2.0のメソッドsetFeature() によって行われます。このメソッドは、設定するフィーチャーを記述するURIとブール値 (true またはfalse) を引数として使用します。参考文献にSAXで定義されたURIのオンライン・リストを示してあります。そのページには、私たちにとって興味のあるフィーチャーがリストされています。そのストリング定数はhttp://xml.org/sax/features/validation であり、前に述べたように、パーサーでは通常、デフォルトでオフになっています。XMLパーサーで妥当性検査を行うように要求するには、リスト1に示すように、このフィーチャーの値をtrue に設定してください。
リスト1. 妥当性検査の要求
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class ValidateXML {
public static void main(String[] args) {
try {
// Create a new XML parser
XMLReader reader = XMLReaderFactory.createXMLReader();
// Request validation
reader.setFeature("http://xml.org/sax/features/validation", true);
// Parse the file as the first argument on the command-line
reader.parse(args[0]);
} catch (SAXException e) {
System.out.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
|
ErrorHandlerによる通知の入手
リスト1で変更を行うと、パーサーは文書の妥当性検査を実行するようになりますが、このコードにはエラーを報告する手段が用意されていないため、検出されたエラーについて、通知を受けることができません。妥当性検査エラーが発生すると (たとえば、許容されないエレメントが検出されると)、SAXコールバックが発生します。しかし、そのコールバックで何かを行う コードを書いておかないと、ユーザーのコードまたはアプリケーション・クライアントには何も報告されません。これに対処するためには、org.xml.sax.ErrorHandler インターフェースをインプリメントしてください。このインターフェースには、警告およびエラー通知を受け取るための3つのメソッドが含まれています。リスト2では、リスト1で示したソースにクラスを追加し、そのエラー・ハンドラーをパーサーに登録しています。
リスト2. ErrorHandlerの作成と登録
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class ValidateXML {
public static void main(String[] args) {
try {
// Create a new XML parser
XMLReader reader = XMLReaderFactory.createXMLReader();
// Request validation
reader.setFeature("http://xml.org/sax/features/validation", true);
// Register the error handler
reader.setErrorHandler(new MyErrorHandler());
// Parse the file as the first argument on the command-line
reader.parse(args[0]);
} catch (SAXException e) {
System.out.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException exception) throws SAXException {
// Bring things to a crashing halt
System.out.println("**Parsing Warning**\n" +
" Line: " + exception.getLineNumber() + "\n" +
" URI: " + exception.getSystemId() + "\n" +
" Message: " + exception.getMessage());
throw new SAXException("Warning encountered");
}
public void error(SAXParseException exception) throws SAXException {
// Bring things to a crashing halt
System.out.println("**Parsing Error**\n" +
" Line: " + exception.getLineNumber() + "\n" +
" URI: " + exception.getSystemId() + "\n" +
" Message: " + exception.getMessage());
throw new SAXException("Error encountered");
}
public void fatalError(SAXParseException exception) throws SAXException {
// Bring things to a crashing halt
System.out.println("**Parsing Fatal Error**\n" +
" Line: " + exception.getLineNumber() + "\n" +
" URI: " + exception.getSystemId() + "\n" +
" Message: " + exception.getMessage());
throw new SAXException("Fatal Error encountered");
}
}
|
これは、ErrorHandler のインプリメンテーションとしてはやや過激な方法であり、なんらかの問題が起こったときには完全に停止してしまいます。私は、穏便に親アプリケーションにエラー・コードを戻すのではなく、画面のエラーを出力してコードから抜け出しています。読者の実動アプリケーションでは、より穏やかなソリューションが必要になることと思われます。しかし、これら3つのメソッドは、どのような問題が発生したのか、またその問題がどこで発生したのかを正確に知るために、大変役に立ちます。ErrorHandler を使用するのは、そのためにほかなりません。妥当性検査をオンにし、エラー・ハンドラーを登録し、「ドカン」とやらかすわけです。これで、SAXによってXMLを妥当性検査することができます。
参考文献
著者について  | 
|  | Brett McLaughlin (brett@newInstance.com) は、Lutris TechnologiesでEnhydraストラテジストを務めており、分散システム・アーキテクチャーを専門としています。また、Java and XML (O'Reilly社) の著者でもあります。Javaサーブレット、Enterprise JavaBeansテクノロジー、XMLおよびビジネス・ツー・ビジネス・アプリケーションなどの技術にかかわっています。氏は、Jason Hunter氏と一緒に、JDOMプロジェクトを設立しました。このプロジェクトは、JavaアプリケーションからXMLを扱う、簡潔なAPIを提供しています。また、Apache CocoonプロジェクトとEJBoss EJBサーバーの開発に積極的に取り組んでおり、Apache Turbineアクティブの共同設立者でもあります。 |
記事の評価
|