Javaの使用この章の内容は次のとおりです。概要XMLスキーマを使用したXMLの検証XMLスキーマを使用したプログラミングのヒントと方法XML検証の概要この項では、XML検証の様々な方法について説明します。内容は次のとおりです。標準と仕様DTDを使用したXML検証XMLスキーマを使用したXML検証XMLスキーマとDTDの違い前提条件この章では、次のテクノロジについて実用的な知識があることを前提にしています。DTDは、XML文書の有効な構造を定義します。Schemaは、XML文書の有効な構造を定義します。これらのテクノロジを十分に理解していない場合や、知識を更新する必要がある場合は、「はじめに」の「関連ドキュメント」にあるXMLの資料を参照してください。SchemaはW3C標準です。Schemaの仕様は次の場所にあります。Schema仕様をサポートしています。関連項目:XDKがサポートする標準の概要は、第29章「XDK標準」を参照してください。DTDを使用したXML検証DTDは、最初はSGML用に開発されました。DTDは、SGMLで使用可能なDTDのサブセットであり、XMLマークアップに対する制約を宣言するためのメカニズムを提供します。DTDによって、次のものを指定できます。XML文書で使用できる要素。XML要素のコンテンツ・モデル。要素にデータのみが含まれるか、またはその構造を定義するサブ要素のセットを含むか。DTDでは、サブ要素がオプションと必須のどちらであるか、またサブ要素の出現が1回のみか複数回可能かを定義します。DTDでは、属性がオプションと必須のどちらであるかも指定できます。XML文書で有効なエンティティ。DTD自体はXMLで記述されているのではなく、XML文書の構造を定義するための、コンテキストに依存しない文法です。DTDは、XML文書内で、またはXML文書とは別のファイルで宣言できます。検証とは、関連するDTDに対してXML文書が妥当であるかどうかを検証して、構造、要素の使用方法および属性の使用方法がDTDの定義と一致していることを確認するプロセスです。XML文書を処理するアプリケーションでは、検証によって、データと定義が一致することを想定できます。XDKを使用することにより、検証XMLパーサー(XML文書を解析して、その文書がDTDに対して妥当かどうかを検証するプログラム)を含むアプリケーションを作成できます。DTD検証を実行するパーサーの次の側面に注意してください。実装に応じて、検証パーサーはエラーの発生時に処理を停止または続行できます。検証パーサーは、警告およびエラーが発生すると、処理の最後にこれらを要約形式で報告できます。ほとんどのプロセッサでは検証モードを有効または無効にできますが、いずれの場合もエンティティ定義とDTDのその他の構成メンバーは処理する必要があります。例5-1に、family.dtdという名前のDTDのコンテンツを示します。このDTDは$ORACLE_HOME/xdk/demo/java/parser/common/にあります。<ELEMENT>タグでは文書内の要素の有効な名称および構造を指定し、<ATTLIST>タグでは要素の有効な属性を指定します。#IMPLIED&gt;例5-2に、family.xmlという名前のXML文書のコンテンツを示します。このXML文書は$ORACLE_HOME/xdk/demo/java/parser/common/にあります。family.xmlの<!DOCTYPE>要素では、このXML文書がfamily.dtdという名前の外部DTDに準拠することを指定します。Schema言語は、XML構文を使用してXML文書のコンテンツおよび構造を記述するためにW3Cで作成されました。Schema言語で記述されたXML文書です。XMLスキーマ文書には、入力XML文書の構造を記述するインスタンス・ドキュメントと呼ばれるルールが含まれています。インスタンス・ドキュメントは、XMLスキーマのルールに準拠する場合のみ有効です。Schema言語では、次のようなことを定義します。検証XMLパーサーは、インスタンス・ドキュメントが関連XMLスキーマのルールに準拠しているかどうかの判断を試行します。XDKを使用することにより、このスキーマ検証を実行する検証パーサーを作成できます。スキーマ検証を実行するパーサーの次の側面に注意してください。実装に応じて、パーサーはエラーの発生時に処理を停止または続行できます。パーサーは、警告およびエラーが発生すると、処理の最後にこれらを要約形式で報告できます。プロセッサは、インスタンス・ドキュメントによって含められたDTDに定義されているエンティティ定義およびその他の構成メンバーを考慮する必要があります。Schema言語では、インスタンス・ドキュメントにXMLスキーマとDTDの両方が含まれる場合に何を行う必要があるかは定義されていません。したがって、このような場合のアプリケーションの動作は実装によって決まります。例5-3に、異なる地域で注文された部品を記述する購入レポートを含むサンプルXML文書を示します。このサンプル・ファイルは、$ORACLE_HOME/xdk/demo/java/schema/report.xmlにあります。&lt;/parts&gt;&lt;/purchaseReport&gt;例5-4に、report.xsdという名前のXMLスキーマ文書を示します。この文書は、report.xmlの検証に使用できるサンプルXMLスキーマ文書です。XMLスキーマは特に、インスタンス・ドキュメントで有効な要素の名前と、要素に含めることのできるデータ型を定義します。Schema言語には、DTD仕様のほとんどの機能が含まれています。XMLスキーマはDTDと同様の目的を果たしますが、文書制約の指定の柔軟性が高くなっています。表5-1に、2つの検証メカニズム間で機能の一部を比較します。機能XMLスキーマDTD要素のネストXX要素の出現の制約XX許可される属性XX属性タイプとデフォルト値XXXMLでの記述X名前空間のサポートX組込みデータ型Xユーザー定義のデータ型X組込み/インポートX再定義(継承)X次に、DTD検証ではなくXMLスキーマ検証を選択する最大の理由を示します。Schema言語では、要素と属性のコンテンツのルールを定義できます。データ型を使用してコンテンツを制御できます。Schemaのデータ型では、次のようなアクションを簡単に実行できます。どの要素にどのデータ型が含まれるかを宣言します。ある要素に正の整数が含まれ、別の要素に年が含まれることを宣言します。データベースから取得したデータを処理します。10から20までの数値など、データに対する制限を定義します。MM-DD-YYYY形式の日付など、データ形式を定義します。文字列から日付など、異なるデータ型間でデータを変換します。Schema言語で記述された文書自体はXMLで記述されています。このため、次のアクションを実行できます。ProcessorはSAXベースのXMLスキーマ・バリデータであり、XMLスキーマに対してインスタンス・ドキュメントが妥当かどうかを検証するために使用できます。プロセッサでは、LAXと厳密な検証の両方がサポートされています。プロセッサは次の方法で使用できます。XMLパーサーで有効にします。DOMツリーで使用して、XML文書の全体または一部を検証します。処理パイプライン(コンテンツ・ハンドラなど)でコンポーネントとして使用します。Processorを構成できます。次の操作を行うことができます。固定のXMLスキーマを使用するか、インスタンス・ドキュメントのschemaLocation属性に基づいてスキーマを自動的に構築します。検証プロセスをより詳細に制御できるようにXMLErrorおよびentityResolverを設定します。インスタンス・ドキュメントをどの程度検証するかを決定します。表3-1に示した検証モードのいずれかを使用できます。検証のルートとして要素の型を指定することもできます。基本プロセス次のXDKパッケージは、XMLスキーマを処理するアプリケーションで重要です。XML解析用のAPIを提供するoracle.xml.parser.v2XMLスキーマ処理用のAPIを提供するoracle.xml.parser.schema表5-2に、oracle.xml.parser.schemaパッケージの最も重要なクラスを示します。これらのクラスは、ほとんどのXMLスキーマ・アプリケーションのコアを形成します。Schemaコンポーネント・モデルを表します。XMLSchemaオブジェクトは、様々なターゲット名前空間に属するXMLSchemaNodesのセットです。XSDValidatorクラスでは、スキーマ検証またはメタデータにXMLSchemaを使用します。主要なメソッドは次のとおりです。getElement()やgetSchemaTargetNS()などのgetメソッドは、XMLスキーマに関する情報を取得します。printSchema()は、XMLスキーマに関する情報を出力します。XMLSchemaNodeクラス型定義、要素と属性の宣言、グループと属性グループの定義など、ターゲット名前空間内のスキーマ・コンポーネントを表します。主要なメソッドはgetElementSet()などのgetメソッドであり、getAttributeDeclarations()はXMLスキーマのコンポーネントを取得します。XSDBuilderクラスXMLスキーマ文書からXMLSchemaオブジェクトを作成します。XMLSchemaオブジェクトは、最上位レベルのスキーマ宣言および定義に対応するオブジェクト(Infoset項目)のセットです。スキーマ文書はXMLで解析され、DOMツリーに変換されます。主要なメソッドは次のとおりです。build()は、XMLSchemaオブジェクトを作成します。getObject()は、XMLSchemaオブジェクトを戻します。setEntityResolver()は、インポートと組込みを解決するためのEntityResolverを設定します。XSDValidatorクラスXMLスキーマに対してXMLインスタンス・ドキュメントが妥当かどうかを検証します。登録されている場合、XSDValidatorオブジェクトはXMLParserとXMLDocumentのイベント・ハンドラ間にパイプライン・ノードとして挿入されます。主要なメソッドは次のとおりです。getCurrentMode()やgetElementDeclaration()などのgetメソッド。setXMLProperty()やsetDocumentLocator()などのsetメソッド。startDocument()は、文書の開始に関する通知を受け取ります。startElement()は、要素の開始に関する通知を受け取ります。Processorでインスタンス・ドキュメントを検証する基本プロセスを示します。Processorは、次の主要タスクを実行します。ビルダー(XSDBuilderオブジェクト)が、入力XMLスキーマ文書からXMLスキーマを作成します。インスタンス・ドキュメントおよびスキーマは、特にオペレーティング・システムにファイルとして存在する必要はありませんが、一般にファイルと呼ばれます。Infosetの情報項目のコレクションとして存在できます。このタスクには、スキーマ文書のオブジェクトへの解析が含まれます。ビルダーは、スキーマ・オブジェクトを明示的または暗黙的に作成します。明示的モードでは、プロセッサを起動するときにXMLスキーマを渡します。「外部参照XMLスキーマに対する検証」では、明示的モードでのスキーマ・オブジェクトの作成方法について説明しています。暗黙的モードでは、スキーマがインスタンス・ドキュメントにより内部的に参照されているため、プロセッサの起動時にXMLスキーマを渡しません。「内部参照XMLスキーマに対する検証」では、暗黙的モードでのスキーマ・オブジェクトの作成方法について説明しています。XMLスキーマ・バリデータでは、スキーマ・オブジェクトを使用してインスタンス・ドキュメントを検証します。このタスクには、次の手順が含まれます。SAXパーサーは、インスタンス・ドキュメントをSAXイベントに解析し、これをバリデータに渡します。バリデータは、SAXイベントを入力として受け取り、これらがスキーマ・オブジェクトに対して妥当かどうかを検証し、無効なXMLコンポーネントが見つかった場合はエラー・メッセージを送信します。「XMLパーサーでの検証」では、インスタンス・ドキュメントの検証時に使用できる検証モードについて説明しています。XSDBuilderクラスを使用して検証用のスキーマを明示的に設定しない場合は、インスタンス・ドキュメントで正しいxsi:schemaLocation属性がスキーマ・ファイルを指している必要があります。ない場合、プログラムは検証を実行しません。プロセッサでエラーが発生した場合は、エラー・メッセージが生成されます。バリデータは、入力SAXイベント、デフォルト値またはスキーマ検証後の情報をDOMビルダーまたはアプリケーションに送信します。APIリファレンス』を参照してください。Javaの使用」を参照してください。Javaのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/schemaに含まれています。Processorのテストに使用できるXMLファイルとプログラムについて説明します。ファイル説明cat.xsdcatalogue.xmlを検証するためにXSDSetSchema.javaプログラムで使用されるサンプルXMLスキーマ。cat.xsdスキーマは、書籍のカタログの構造を指定します。catalogue.xmlcat.xsdスキーマに対して妥当かどうかを検証するためにXSDSetSchema.javaプログラムで使用されるサンプル・インスタンス・ドキュメント。catalogue_e.xmlXSDSample.javaプログラムで使用されるサンプル・インスタンス・ドキュメント。プログラムは、cat.xsdスキーマに対してこのドキュメントが妥当かどうかの検証を試行すると、スキーマ・エラーを生成します。Schemaに変換し、これを使用してXMLファイル(第2引数)を検証します。embeded_xsql.xsdXSDLax.javaで使用されるXMLスキーマ。スキーマでは、XSQLページの構造を定義します。embeded_xsql.xmlXSDLax.javaで使用されるインスタンス・ドキュメント。juicer1.xmlxsdproperty.javaで使用するサンプルXML文書。この文書を定義するXMLスキーマはjuicer1.xsdです。juicer1.xsdxsdproperty.javaで使用するサンプルXMLスキーマ。このXMLスキーマは、juicer1.xmlを定義します。juicer2.xmlxsdproperty.javaで使用するサンプルXML文書。この文書を定義するXMLスキーマはjuicer2.xsdです。juicer2.xsdxsdproperty.javaで使用するサンプルXML文書。このXMLスキーマは、juicer2.xmlを定義します。report.xmlXMLスキーマreport.xsdに対して妥当かどうかを検証するためにXSDSetSchema.javaで使用されるサンプルXMLファイル。report.xsdreport.xmlのコンテンツを検証するためにXSDSetSchema.javaプログラムで使用されるサンプルXMLスキーマ。report.xsdスキーマは、発注書の構造を指定します。Schemaエラーを生成します。xsddom.javaこのプログラムは、ドキュメントのDOM表現を取得し、XSDValidatorオブジェクトを使用してこれを検証することにより、インスタンス・ドキュメントを検証する方法を示します。xsdent.javaこのプログラムは、SchemaLocation属性で参照されているスキーマをローカル・バージョンにリダイレクトすることにより、XML文書を検証します。xsdent.xmlこのXML文書は書籍を記述します。ファイルは、xsdent.javaへの入力として使用されます。xsdent.xsdこのXMLスキーマ文書は、xsdent.xmlのルールを定義します。スキーマ文書には、xsdent-1.xsdに設定されたschemaLocation属性が含まれています。xsdent-1.xsdxsdent.xsdのschemaLocation属性により参照されているXMLスキーマ文書。Processorを構成する方法を示します。xsdsax.javaこのデモは、SAXストリームとして受け取ったXML文書の検証方法を示します。XSDLax.javaこのデモは、XSDSetSchema.javaと同じですが、SCHEMA_LAX_VALIDATIONフラグをLAX検証用に設定します。XSDSample.javaこのプログラムは、XMLインスタンス・ドキュメントの処理に使用できるサンプル・ドライバです。XSDSetSchema.javaこのプログラムは、schemaLocationをオーバーライドすることでXMLインスタンス・ドキュメントを処理するためのサンプル・ドライバです。Schema仕様を使用して、catalogue.xmlのコンテンツを検証します。サンプル・プログラムのコンパイル方法および実行方法は、同じディレクトリにあるREADMEに示されています。基本手順は次のとおりです。ディレクトリを$ORACLE_HOME/xdk/demo/java/schemaディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\schemaディレクトリ(Windowsの場合)に変更します。コマンドラインでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行します。xmlparserv2.jar、xschema.jarおよび現在のディレクトリをCLASSPATHに追加します。これらのJARファイルは$ORACLE_HOME/lib(UNIXの場合)および%ORACLE_HOME%\lib(Windowsの場合)にあります。CLASSPATHは、UNIXのtcshシェルで次のように設定できます。1.2をサポートしている任意のオペレーティング・システムで使用できます。ディレクトリに含まれているXMLファイルを使用してサンプル・プログラムを実行します。次の例では、report.xsdを使用して、report.xmlのコンテンツを検証します。report.xml次の例では、Laxモードでインスタンス・ドキュメントを検証します。embeded_xsql.xml次の例では、cat.xsdを使用して、catalogue.xmlのコンテンツを検証します。catalogue.xml次の例では、エラー・メッセージを生成します。report_e.xml次の例では、xsdent.xsdのschemaLocation属性を使用して、XMLスキーマを検証のためにxsdent-1.xsdにリダイレクトします。xsdent.xsd次の例では、report.xmlからSAXストリームを生成し、report.xsdで定義されているXMLスキーマに対して妥当かどうかを検証します。report.xml次の例では、report.xmlのDOM表現を作成し、report.xsdで定義されているXMLスキーマに対して妥当かどうかを検証します。report.xml次の例では、要素宣言または複合型定義から開始する検証を構成します。juicers_e.out次の例では、DTD(dtd2schema.dtd)をXMLスキーマに変換し、これを使用してインスタンス・ドキュメント(dtd2schema.xml)を検証します。Parserコマンドライン・ユーティリティの使用」では、oraxmlコマンドライン・ユーティリティの実行方法を説明しています。このユーティリティを使用して、XMLスキーマとDTDに対してインスタンス・ドキュメントが妥当かどうかを検証できます。oraxmlを使用したスキーマに対する検証$ORACLE_HOME/xdk/demo/java/schemaディレクトリに変更します。例5-5に、コマンドラインで次のコマンドを実行することにより、report.xmlがreport.xsdに対して妥当かどうかを検証する方法を示します。report.xml取得される出力は次のとおりです。mode.oraxmlを使用したDTDに対する検証$ORACLE_HOME/xdk/demo/java/parser/commonディレクトリに変更します。例5-6に、コマンドラインで次のコマンドを実行することにより、family.xmlがfamily.dtdに対して妥当かどうかを検証する方法を示します。family.xml取得される出力は次のとおりです。mode.XMLスキーマを使用したXMLの検証この項の内容は次のとおりです。内部参照XMLスキーマに対する検証$ORACLE_HOME/xdk/demo/java/schema/XSDSample.javaプログラムは、暗黙的なXMLスキーマに対して妥当かどうかを検証する方法を示します。XMLスキーマはインスタンス・ドキュメント自体で参照されているため、検証モードは暗黙的です。この項の手順に従って、oracle.xml.parser.v2.DOMParserクラスのsetValidationMode()メソッドを使用するプログラムを作成します。インスタンス・ドキュメントの検証に使用するDOMパーサーを作成します。XSDSample.javaの次のコード部分は、DOMParserオブジェクトの作成方法を示します。}...}createURL()は、プログラムに引数として渡されるファイル名からURLを構築するヘルパー・メソッドです。DOMParser.setValidationMode()メソッドを使用して検証DOMパーサーの検証モードを設定します。XSDSample.javaはXMLスキーマ検証の指定方法を示します。dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);dp.setPreserveWhitespace(true);DOMParser.setErrorStream()メソッドを使用して出力エラー・ストリームを設定します。XSDSample.javaはDOMパーサー・オブジェクトのエラー・ストリームを次のように設定します。(System.out);DOMParser.parse()メソッドを使用してインスタンス・ドキュメントを検証します。スキーマはインスタンス・ドキュメントにより内部的に参照されているため、XMLスキーマ・オブジェクトを明示的に作成する必要はありません。XSDSample.javaはインスタンス・ドキュメントを次のように検証します。e.getMessage());}外部参照XMLスキーマに対する検証$ORACLE_HOME/xdk/demo/java/schema/XSDSetSchema.javaプログラムは、XMLスキーマを明示的に検証する方法を示します。XSDBuilderクラスを使用して検証用のスキーマを指定するため、検証モードは明示的です。暗黙的な検証の場合とは異なり、スキーマはインスタンス・ドキュメントでは指定されません。この項の基本手順に従って、oracle.xml.parser.schema.XSDBuilderクラスのbuild()メソッドを使用するJavaプログラムを作成します。XSDBuilder.build()メソッドを使用して、XMLスキーマ文書からXMLスキーマ・オブジェクトを作成します。XSDSetSchema.javaの次のコード部分は、オブジェクトの作成方法を示します。.createURL()メソッドは、コマンドラインで指定されたスキーマ文書ファイル名からURLを構築するヘルパー・メソッドです。インスタンス・ドキュメントの検証に使用するDOMパーサーを作成します。XSDSetSchema.javaの次のコードは、インスタンス・ドキュメントのファイル名とXMLスキーマ・オブジェクトをprocess()メソッドに渡す方法を示します。.DOMParser.setXMLSchema()メソッドを使用して、検証に使用するスキーマ・オブジェクトを指定します。暗黙的検証モードでは、インスタンス・ドキュメントがすでにスキーマを参照しているため、この手順は不要です。XSDSetSchema.javaはスキーマを次のように指定します。dp.setXMLSchema(schemadoc);DOMParser.setValidationMode()メソッドを使用してDOMパーサー・オブジェクトの検証モードを設定します。XSDSample.javaはXMLスキーマ検証の指定方法を示します。dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);dp.setPreserveWhitespace(true);DOMParser.setErrorStream()メソッドを使用してパーサーの出力エラー・ストリームを設定します。XSDSetSchema.javaは出力エラー・ストリームを次のように設定します。(System.out);DOMParser.parse()メソッドを使用して、インスタンス・ドキュメントがXMLスキーマに対して妥当かどうかを検証します。XSDSetSchema.javaには次のコードが含まれます。e.getMessage());}XML文書のサブセクションの検証LAXモードでは、文書全体を検証せずに、インスタンス・ドキュメントのXMLコンテンツの一部を検証できます。LAXパーサーは、関連するXMLスキーマで宣言されているインスタンス・ドキュメントの要素に対してプロセッサが検証を実行する必要があることを示します。プロセッサは、スキーマで宣言された要素がインスタンス・ドキュメントに含まれていない場合でも、そのインスタンス・ドキュメントを無効とみなしません。LAXモードを使用することにより、XMLの検証対象部分に対してのみスキーマを定義できます。$ORACLE_HOME/xdk/demo/java/schema/XSDLax.javaプログラムは、LAX検証の使用方法を示します。このプログラムは、「外部参照XMLスキーマに対する検証」で説明している基本手順を実行します。ユーザー指定のXMLスキーマ文書から、XMLスキーマ・オブジェクトを作成します。インスタンス・ドキュメントの検証に使用するDOMパーサーを作成します。検証に使用するXMLスキーマを指定します。DOMパーサー・オブジェクトの検証モードを設定します。パーサーの出力エラー・ストリームを設定します。DOMParser.parse()をコールすることにより、XMLスキーマに対してインスタンス・ドキュメントが妥当かどうかを検証します。LAX検証を有効にするには、パーサーの検証モードをSCHEMA_VALIDATIONではなくSCHEMA_LAX_VALIDATIONに設定します。XSDLax.javaの次のコード部分は、この方法を示しています。.サンプル・プログラムを次のように実行することにより、LAX検証をテストできます。embeded_xsql.xmlSAXストリームからのXMLの検証$ORACLE_HOME/xdk/demo/java/schema/xsdsax.javaプログラムは、SAXストリームとして受け取ったXML文書を検証する方法を示します。XSDValidatorをインスタンス化し、SAXパーサーにコンテンツ・ハンドラとして登録します。この項の手順に従って、SAXストリームからXMLを検証するプログラムを作成します。XSDBuilder.build()メソッドを起動することにより、ユーザー指定のXMLスキーマ文書からXMLスキーマ・オブジェクトを作成します。次のコード部分は、オブジェクトの作成方法を示します。.createURL()は、コマンドラインで指定されたファイル名からURLを作成するヘルパー・メソッドです。インスタンス・ドキュメントの検証に使用するSAXパーサー(SAXParserオブジェクト)を作成します。saxxsd.javaの次のコード部分は、XML文書とスキーマ文書へのハンドルをprocess()メソッドに渡します。SAXParser();...SAXパーサーを構成します。次のコード部分は、XSDBuilder.setValidationMode()メソッドを使用してSAXパーサー・オブジェクトの検証モードを設定します。(true);dp.setValidationMode(XMLParser.NONVALIDATING);バリデータ(XSDValidatorオブジェクト)を作成して構成します。次のコード部分は、この方法を示します。XSDValidator();...validator.setError(err);XSDBuilder.setXMLProperty()メソッドを起動することにより、検証に使用するXMLスキーマを指定します。最初の引数はプロパティの名前(fixedSchema)で、2番目の引数はXMLスキーマ・オブジェクトへの参照です。次のコード部分は、この方法を示します。schemadoc);...バリデータをパーサーのSAXコンテンツ・ハンドラとして登録します。次のコード部分は、この方法を示します。dp.setContentHandler(validator);...SAXParser.parse()メソッドを起動することにより、インスタンス・ドキュメントがXMLスキーマに対して妥当かどうかを検証します。次のコード部分は、この方法を示します。(url);DOMからのXMLの検証$ORACLE_HOME/xdk/demo/java/schema/xsddom.javaプログラムは、ドキュメントのDOM表現を取得し、XSDValidatorオブジェクトを使用してこれを検証することにより、インスタンス・ドキュメントを検証する方法を示します。xsddom.javaプログラムは次の手順を実行します。XSDBuilder.build()メソッドを起動することにより、ユーザー指定のXMLスキーマ文書からXMLスキーマ・オブジェクトを作成します。次のコード部分は、オブジェクトの作成方法を示します。schemadoc);createURL()は、コマンドラインで指定されたファイル名からURLを作成するヘルパー・メソッドです。インスタンス・ドキュメントの検証に使用するDOMパーサー(DOMParserオブジェクト)を作成します。domxsd.javaの次のコード部分は、XML文書とスキーマ文書へのハンドルをprocess()メソッドに渡します。.DOMパーサーを構成します。次のコード部分は、DOMParser.setValidationMode()メソッドを使用してパーサー・オブジェクトの検証モードを設定します。(System.out);インスタンス・ドキュメントを解析します。次のコード部分は、この方法を示します。(url);入力文書のDOM表現を取得します。次のコード部分は、この方法を示します。dp.getDocument();バリデータ(XSDValidatorオブジェクト)を作成して構成します。次のコード部分は、この方法を示します。XSDValidator();...validator.setError(err);XSDBuilder.setXMLProperty()メソッドを起動することにより、検証に使用するスキーマ・オブジェクトを指定します。最初の引数はプロパティの名前(この例ではfixedSchema)で、2番目の引数はスキーマ・オブジェクトへの参照です。次のコード部分は、この方法を示します。.DOMツリーのルート要素(XMLElement)を取得し、検証します。次のコード部分は、この方法を示します。Processorを構成する方法を示します。xsdproperty.javaプログラムは次の手順を実行します。インスタンス・ドキュメント名、XMLスキーマ名、ルート・ノードの名前空間、ルート・ノードのローカル名、および要素または複合型の指定("true"はルート・ノードが要素宣言であることを意味します)に関するStringオブジェクトを作成します。次のコード部分は、この方法を示します。typeXSDビルダーを作成し、それを使用してスキーマ・オブジェクトを作成します。次のコード部分は、この方法を示します。builder.build(url);ノードを取得します。ノードが要素宣言と複合型のどちらであるかに応じて異なるメソッドを起動します。ノードが要素宣言である場合は、ローカル名と名前空間をスキーマ・オブジェクトのgetElement()メソッドに渡します。ノードが要素宣言である場合は、名前空間、ローカル名およびルート複合型をスキーマ・オブジェクトのgetType()メソッドに渡します。xsdproperty.javaは、次の制御構造を使用します。*/}ノードを取得した後で、新規パーサーを作成し、スキーマをパーサーに設定してスキーマ検証を有効にします。次のコード部分は、この方法を示します。(xmlURI);パーサー上のプロパティを設定し、URLを解析します。schemaValidatorProperty()メソッドを次のように起動します。パーサーのルート要素または型プロパティを完全修飾名に設定します。最上位レベルの要素宣言では、process1()メソッドで示されているように、プロパティ名をXSDNode.ROOT_ELEMENTに設定し、値をQNameに設定します。最上位レベルの型定義では、process2()メソッドで示されているように、プロパティ名をXSDNode.ROOT_TYPEに設定し、値をQNameに設定します。パーサーのルート・ノード・プロパティを要素または複合型ノードに設定します。要素ノードでは、process3()メソッドで示されているように、プロパティ名をXSDNode.ROOT_NODEに設定し、値をXSDElementノードに設定します。型ノードでは、process3()メソッドで示されているように、プロパティ名をXSDNode.ROOT_NODEに設定し、値をXSDComplexTypeノードに設定します。次のコード部分はメソッドの起動順序を示します。nd);}処理メソッドは次のように実装されます。Beanは、oracle.xml.parser.schema.XSDValidatorクラスをカプセル化し、DOMツリーの検証機能を追加します。パーサーは、インスタンス・ドキュメントとXMLスキーマ文書のDOMツリーを構築し、インスタンス・ドキュメントがスキーマに対して妥当かどうかを検証します。Beanの使用方法を示します。Beanを使用するJavaプログラムを作成します。DOMParser.parse()メソッドを使用してインスタンス・ドキュメントを解析します。XSDValidatorSample.javaの次のコード部分は、この方法を示します。parseXMLDocument(xmlinstanceurl);createURL()は、ファイル名からURLを作成するヘルパー・メソッドです。parseXMLDocument()メソッドは、次のように、URLを入力として受け取り、DOMParser.parse()メソッドを使用して解析します。parser.getDocument();DOMParser.parse()メソッドを使用してXMLスキーマ文書を解析します。XSDValidatorSample.javaの次のコードは、この方法を示します。parseXMLDocument(schemaurl);XSDBuilder.build()メソッドを使用して、解析したXMLスキーマからスキーマ・オブジェクトを作成します。XSDValidatorSample.javaの次のコード部分は、この方法を示します。createURL(args+"builder"));XSDValidator.setSchema()メソッドに参照を渡すことにより、検証に使用するスキーマ・オブジェクトを指定します。XSDValidatorSample.javaの次のコード部分は、バリデータを作成し、スキーマを設定します。.xsdval.setSchema(xmlschema);XSDValidator.setError()メソッドを起動することにより、バリデータのエラー出力ストリームを設定します。XSDValidatorSample.javaの次のコード部分は、オブジェクトの作成方法を示します。.xsdval.setError(err);インスタンス・ドキュメントへの参照をXSDValidator.validate()メソッドに渡すことにより、インスタンス・ドキュメントがスキーマに対して妥当かどうかを検証します。XSDValidatorSample.javaには次のコード部分が含まれます。xsdval.validate(xmldoc1);XMLスキーマを使用したプログラミングのヒントと方法この項の内容は次のとおりです。エンティティ・リゾルバによるスキーマの場所のオーバーライドDTDからXMLスキーマへの変換エンティティ・リゾルバによるスキーマの場所のオーバーライドXSDBuilderは、スキーマを構築する場合に、schemaLocation属性でURLとして指定された他のスキーマを組込みまたはインポートすることが必要な場合があります。表5-3で説明したxsdent.javaデモでは、この事例を示しています。xsdent.xmlファイルの文書要素には、次の属性が含まれます。xsdent.xsd"&gt;xsdent.xsd文書には、次の要素が含まれます。/&gt;場合によっては、<import>で指定したスキーマの場所をオーバーライドし、必要なスキーマ文書をビルダーに提供することが必要になります。スキーマ文書を外部Webサイトからダウンロードし、それをデータベースに格納する場合があります。このような場合は、XSDBuilderにエンティティ・リゾルバを設定できます。XSDBuilderは、スキーマの場所をリゾルバに渡します。リゾルバは、InputStream、ReaderまたはURLをInputSourceとして戻します。ビルダーは、InputSourceからスキーマ文書を読み取ることができます。xsdent.javaプログラムは、エンティティ・リゾルバを使用してスキーマの場所をオーバーライドする方法を示します。EntityResolverインタフェースを実装し、エンティティ・リゾルバをインスタンス化し、それをXMLスキーマ・ビルダーに設定する必要があります。デモ・コードでは、sampleEntityResolver1はInputSourceをInputStreamとして戻しますが、sampleEntityResolver2はInputSourceをURLとして戻します。次の基本手順に従います。新規XMLスキーマ・ビルダーを次のように作成します。XSDBuilder();ビルダーをエンティティ・リゾルバに設定します。エンティティ・リゾルバは、EntityResolverインタフェースを実装するクラスです。リゾルバの目的は、XMLリーダーが、外部エンティティを組み込む前に、それらのエンティティをインターセプトできるようにすることです。次のコード部分は、エンティティ・リゾルバを作成し、それをビルダーに設定します。sampleEntityResolver1());sampleEntityResolver1クラスは、resolveEntity()メソッドを実装します。このメソッドを使用して、外部システム識別子をローカルURIにリダイレクトできます。このソース・コードは次のようになります。}}sampleEntityResolver1はInputSourceをストリームで初期化することに注意してください。XMLスキーマ・オブジェクトを作成します。この方法を示すコードは次のとおりです。builder.build(url);XMLスキーマに対してインスタンス・ドキュメントが妥当かどうかを検証します。プログラムは次の文を実行します。schemadoc);process()メソッドはDOMパーサーを作成して構成し、parse()メソッドを起動します。メソッドは次のように実装されます。Schema文書に変換できます。APIを使用して、この変換を実行できます。$ORACLE_HOME/xdk/demo/java/schema/DTD2Schema.javaプログラムは、DTDの変換方法を示します。プログラムは次のようにテストできます。dtd2schema.xml次の基本手順に従って、DTDをXMLスキーマ文書に変換します。DOMParser.parseDTD()メソッドを使用してDTDを解析します。DTD2Schema.javaの次のコード部分は、DTDオブジェクトの作成方法を示します。"abc");getDTD()メソッドは次のように実装されます。dtd;}DTD.convertDTD2Sdhema()メソッドを使用して、DTDをXMLスキーマのDOMツリーに変換します。DTD2Schema.javaの次のコード部分は、この方法を示します。dtd.convertDTD2Schema();XMLDocument.print()メソッドを使用して、XMLスキーマのDOMツリーを出力ストリームに書き出します。DTD2Schema.javaの次のコード部分は、この方法を示します。FileOutputStream("dtd2schema.xsd.out");dtddoc.print(fos);XSDBuilder.build()メソッドを使用して、スキーマのDOMツリーからXMLスキーマ・オブジェクトを作成します。DTD2Schema.javaの次のコード部分は、この方法を示します。null);DOMParser.parse()メソッドを使用して、インスタンス・ドキュメントがXMLスキーマに対して妥当かどうかを検証します。DTD2Schema.javaの次のコード部分は、この方法を示します。schemadoc);validate()メソッドは次のように実装されます。