Expeditor Toolkit バージョン 6.1.x
XML パーサーを使用する必要があるアプリケーションは、XML パーサー・サービス・インターフェースを使用しなければなりません。XML パーサー・サービス・インターフェースを使用することによって、アプリケーションは実行時に動的にパーサーを選択することができ、XML パーサー・サービスによりパーサー・サービス・イベントがアプリケーションに通知されます。ただし、XML パーサー・サービスを使用するには、既存のアプリケーションを変更する必要があります。
アプリケーションは、サービス・インターフェースを使用せずに、標準 JAXP 呼び出しを使用することができます。パーサー・ファクトリーを提供する API は、基本のサービス・インターフェースを使用します。 この状態では、実行時にアプリケーションが動的にパーサーを選択することは不可能であるため、パーサー・サービスが除去されると、アプリケーションはイベント通知を受信できなくなります。パーサー・アクションが試行され、パーサーが存在しない場合、アプリケーションは javax.xml.parsers.FactoryConfigurationError を受信することになります。
SAX パーサーの標準的な使用では、以下のように、SAX パーサー・ファクトリーへの参照を取得してから、新規パーサーを取得することになります。
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
以下の例は、XML パーサー・サービスを使用して SAX パーサー・ファクトリーへの参照を取得する方法を示しています。
ServiceReference ref =
context.getServiceReference(SAXParserFactory.class.getName() );
SAXParserFactory factory = context.getService( ref );
SAXParser parser = factory.newSAXParser();
ファクトリー参照をいったん取得すると、newInstance 呼び出しを発行する必要はなくなります。
同様に、DocumentBuilderFactory を使用する場合の JAXP を使用した標準シーケンスは、以下のとおりです。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
以下の例は、XML パーサー・サービスを使用して DocumentBuilderFactory を使用する方法を示しています。
ServiceReference ref =
context.getServiceReference( DocumentBuilderFactory.class.getName() );
DocumentBuilderFactory factory = context.getService( ref );
DocumentBuilder builder = factory.newDocumentBuilder();
ファクトリー参照をいったん取得すると、newInstance 呼び出しを発行する必要はなくなります。
SAX インターフェースは、SAXParser オブジェクトでのプロパティー設定を許可します。MicroXML は検証をサポートしないため、MicroXML で検証プロパティーを設定しようとすると、org.xml.sax.SAXNotSupportedException がスローされることになります。 ご使用のコードがいずれのパーサーにも固有でない場合は、機能を設定しようとすると例外を受信するので、これらを適切に処理できるように準備しておかなければなりません。
別のパーサーの実装がプラグインされている場合は、その他の機能を設定しようとすると、結果として例外が発生します。特定のパーサー属性が必要な場合は、パーサー・ファクトリー・サービスの要求時に指定できます。
XML リソースがプラグインからロードされる場合、DTD または XSD を使用して XML の検証を実行することは可能です。リソースはプラグインからロードされるので、DTD ファイルのロケーションの指示を提供する必要があります。構文解析が必要な XML 文書用に InputSource オブジェクトを作成します。Bundle.getEntry() または Bundle.getResource() メソッドを使用して、URL を取得するか、またはストリームからリソースをロードします。InputSource のシステム ID をファイルをロードするために使用する URL に設定します。このプロセスを使用することによって、DTD を見付ける EntityResolver インスタンスを作成する必要はありません。
バンドル内に含まれるファイルに対する DTD またはスキーマの検証を許可するには、以下の方法を使用します。
ServiceReference ref =
context.getServiceReference(SAXParserFactory.class.getName() );
SAXParserFactory factory = context.getService( ref );
SAXParser parser = factory.newSAXParser();
XMLReader xmlReader = parser.getXMLReader();
xmlReader.setContentHandler(this);
xmlReader.setErrorHandler(this);
xmlReader.setFeature("http://xml.org/sax/features/namespaces", true);
xmlReader.setFeature("http://xml.org/sax/features/validation", true);
xmlReader.setFeature("http://apache.org/xml/features/validation/schema",
true );
URL url = getClass().getResource(uri);
java.io.InputStream is = url.openStream();
[1] InputSource input = new InputSource(is);
[2] input.setSystemId( url.toExternalForm() );
xmlReader.parse(input);