9 XML Schema Processor for Javaの使用

このトピックでは、Extensible Markup Language (XML) Schema Processor for Javaの使用方法について説明します。

トピック:

9.1 XML検証の概要

次のトピックでは、XML検証の様々な方法について説明します。

トピック:

9.1.1 XML Schema Processor for Javaの使用の前提条件

XML Schema Processorの使用の前提条件を示します。

この項では、次のテクノロジについて実用的な知識があることを前提にしています。

これらのテクノロジの詳細は、「関連ドキュメント」のXMLの資料を参照してください。

9.1.2 XML Schema Processor for Javaの標準および仕様

XML Schemaは、World Wide Web Consortium (W3C)の標準です。

Oracle XML Schema Processorは、W3CのXML Schema仕様をサポートしています。

9.1.3 DTDを使用したXML検証

Document Type Definition (DTD)は、当初SGML用に開発されました。XML DTDは、SGMLで使用可能なDTDのサブセットであり、XMLマークアップに対する制約を宣言するためのメカニズムを提供します。XML DTDによって、次のものを指定できます。

  • XML文書で使用できる要素。

  • XML要素のコンテンツ・モデル。つまり、要素にデータのみが含まれるか、またはその構造を定義するサブ要素のセットを含むか。DTDでは、サブ要素がオプションと必須のどちらであるか、またサブ要素の出現が1回のみか複数回可能かを定義します。

  • XML要素の属性。DTDでは、属性がオプションと必須のどちらであるかも指定できます。

  • XML文書で有効なエンティティ。

XML DTD自体はXMLで記述されているのではなく、XML文書の構造を定義するための、コンテキストに依存しない文法です。DTDは、XML文書内で、またはXML文書とは別のファイルで宣言できます。

検証とは、関連するDTDに対してXML文書が妥当であるかどうかを検証して、構造、要素の使用方法および属性の使用方法がDTDの定義と一致していることを確認するプロセスです。XML文書を処理するアプリケーションでは、検証によって、データと定義が一致することを想定できます。

XDKを使用すると、検証XMLパーサー(XML文書を解析して、その文書がDTDに対して妥当かどうかを検証するプログラム)を含むアプリケーションを作成できます。実装に応じて、検証パーサーは次のように動作します。

  • エラーの検出時に処理を停止するか、続行します。

  • 警告およびエラーを発生時に報告するか、処理の最後に要約形式で報告します。

  • 検証モードを有効化するか、無効化します。

    ほとんどのプロセッサでは検証モードを有効または無効にできますが、いずれの場合もエンティティ定義とDTDのその他の構成メンバーは処理する必要があります。

トピック:

9.1.3.1 XDK内のサンプルDTD

DTDの例と、このDTDに従ったXML文書の例を示します。

例9-1に、family.dtdという名前のDTDのコンテンツを示します。このDTDは$ORACLE_HOME/xdk/demo/java/parser/common/にあります。<ELEMENT>タグでは文書内の要素の有効な名称および構造を指定し、<ATTLIST>タグでは要素の有効な属性を指定します。

例9-2に、family.xmlという名前のXML文書のコンテンツを示します。このXML文書は$ORACLE_HOME/xdk/demo/java/parser/common/にあります。family.xml<!DOCTYPE>要素では、このXML文書がfamily.dtdという名前の外部DTDに準拠することを指定します。

例9-1 family.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT family (member*)>
<!ATTLIST family lastname CDATA #REQUIRED>
<!ELEMENT member (#PCDATA)>
<!ATTLIST member memberid ID #REQUIRED>
<!ATTLIST member dad IDREF #IMPLIED>
<!ATTLIST member mom IDREF #IMPLIED>

例9-2 family.xml

<?xml version="1.0" standalone="no"?>
<!DOCTYPE family SYSTEM "family.dtd">
<family lastname="Smith">
<member memberid="m1">Sarah</member>
<member memberid="m2">Bob</member>
<member memberid="m3" mom="m1" dad="m2">Joanne</member>
<member memberid="m4" mom="m1" dad="m2">Jim</member>
</family>

9.1.4 XMLスキーマを使用したXML検証

XMLスキーマを使用した検証に関する概念について説明します。

XML Schema定義とも呼ばれるXML Schema言語は、XML構文を使用してXML文書のコンテンツおよび構造を記述するためにW3Cで作成されました。XMLスキーマは、XML Schema言語で記述されたXML文書です。XMLスキーマ文書には、入力XML文書の構造を記述するインスタンス・ドキュメントと呼ばれるルールが含まれています。インスタンス・ドキュメントは、XMLスキーマのルールに準拠する場合のみ有効です。

XML Schema言語では、次のようなことを定義します。

  • インスタンス・ドキュメントで有効な要素および属性

  • 他の要素の子にすることのできる要素

  • 子要素の順序と数

  • 要素と属性のデータ型

  • 要素と属性のデフォルト値と固定値

検証XMLパーサーは、インスタンス・ドキュメントが関連XMLスキーマのルールに準拠しているかどうかの判断を試行します。XDKを使用すると、このスキーマ検証を実行する検証パーサーを作成できます。実装に応じて、検証パーサーは次のように動作します。

  • エラーの検出時に処理を停止するか、続行します。

  • 警告およびエラーを発生時に報告するか、処理の最後に要約形式で報告します。

プロセッサは、インスタンス・ドキュメントによって含められたDTDに定義されているエンティティ定義およびその他の構成メンバーを考慮する必要があります。XML Schema言語では、インスタンス・ドキュメントにXMLスキーマとDTDの両方が含まれる場合に何を行う必要があるかは定義されていません。したがって、このような場合のアプリケーションの動作は実装によって決まります。

トピック:

9.1.4.1 XDK内のサンプルXML Schema

異なる地域で注文された部品を記述する購入レポートを含む、サンプルXML文書を示します。この文書は、$ORACLE_HOME/xdk/demo/java/schema/report.xmlにあります。report.xmlの検証に使用できる、XMLスキーマ文書report.xsdも示します。

XMLスキーマは特に、インスタンス・ドキュメントで有効な要素の名前と、要素に含めることのできるデータ型を定義します。

例9-3 report.xml

<purchaseReport
  xmlns="http://www.example.com/Report"
  xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.example.com/Report  report.xsd"
  period="P3M" periodEnding="1999-12-31">
 <regions>
  <zip code="95819">
   <part number="872-AA" quantity="1"/>
   <part number="926-AA" quantity="1"/>
   <part number="833-AA" quantity="1"/>
   <part number="455-BX" quantity="1"/>
  </zip>
  <zip code="63143">
   <part number="455-BX" quantity="4"/>
  </zip>
 </regions>
 <parts>
  <part number="872-AA">Lawnmower</part>
  <part number="926-AA">Baby Monitor</part>
  <part number="833-AA">Lapis Necklace</part>
  <part number="455-BX">Sturdy Shelves</part>
 </parts>
</purchaseReport>

例9-4 report.xsd

<schema targetNamespace="http://www.example.com/Report"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:r="http://www.example.com/Report"
        elementFormDefault="qualified">
 <annotation>
  <documentation xml:lang="en">
   Report schema for Example.com
   Copyright 2000 Example.com. All rights reserved.
  </documentation>
 </annotation>
 <element name="purchaseReport">
  <complexType>
   <sequence>
    <element name="regions" type="r:RegionsType">
     <keyref name="dummy2" refer="r:pNumKey">
      <selector xpath="r:zip/r:part"/>
      <field xpath="@number"/>
     </keyref>
    </element>
    <element name="parts" type="r:PartsType"/>
   </sequence>
   <attribute name="period"       type="duration"/>
   <attribute name="periodEnding" type="date"/>
  </complexType>
  <unique name="dummy1">
   <selector xpath="r:regions/r:zip"/>
   <field xpath="@code"/>
  </unique>
  <key name="pNumKey">
   <selector xpath="r:parts/r:part"/>
   <field xpath="@number"/>
  </key>
 </element>
 <complexType name="RegionsType">
  <sequence>
   <element name="zip" maxOccurs="unbounded">
    <complexType>
     <sequence>
      <element name="part" maxOccurs="unbounded">
       <complexType>
        <complexContent>
         <restriction base="anyType">
          <attribute name="number"   type="r:SKU"/>
          <attribute name="quantity" type="positiveInteger"/>
         </restriction>
        </complexContent>
       </complexType>
      </element>
     </sequence>
     <attribute name="code" type="positiveInteger"/>
    </complexType>
   </element>
  </sequence>
 </complexType>
 <simpleType name="SKU">
  <restriction base="string">
   <pattern value="\d{3}-[A-Z]{2}"/>
  </restriction>
 </simpleType>
 <complexType name="PartsType">
  <sequence>
   <element name="part" maxOccurs="unbounded">
    <complexType>
     <simpleContent>
      <extension base="string">
       <attribute name="number" type="r:SKU"/>
      </extension>
     </simpleContent>
    </complexType>
   </element>
  </sequence>
 </complexType>
</schema>

9.1.5 XMLスキーマとDTDの違い

XML Schema言語には、DTD仕様のほとんどの機能が含まれています。XMLスキーマはDTDと同様の目的を果しますが、文書制約の指定の柔軟性が高くなっています。

表9-1で、2つの検証メカニズム間で一部の機能を比較します。

表9-1 XMLスキーマとDTDの機能の比較

機能 XML Schema DTD

要素のネスト

X

X

要素の出現の制約

X

X

許可される属性

X

X

属性タイプとデフォルト値

X

X

XMLでの記述

X

名前空間のサポート

X

組込みデータ型

X

ユーザー定義データ型

X

組込み/インポート

X

再定義(継承)

X

次に、DTD検証ではなくXMLスキーマ検証を選択する最大の理由を示します。

  • XMLスキーマ言語では、要素と属性のコンテンツのルールを定義できます。データ型を使用してコンテンツを制御できます。XML Schemaのデータ型では、次のようなアクションを簡単に実行できます。

    • どの要素にどのデータ型が含まれるかを宣言します。たとえば、ある要素に正の整数が含まれ、別の要素に年が含まれることを宣言します。

    • データベースから取得したデータを処理します。

    • 10から20までの数値など、データに対する制限を定義します。

    • MM-DD-YYYY形式の日付など、データ形式を定義します。

    • 文字列から日付など、異なるデータ型間でデータを変換します。

  • DTDの文法とは異なり、XML Schema言語で記述された文書自体はXMLで記述されています。したがって、次のアクションを実行できます。

    • XMLパーサーを使用したXMLスキーマの解析

    • XML Document Object Model (DOM)によるXMLスキーマの処理

    • Extensible Stylesheet Language Transformation (XSLT)によるXML文書の変換

    • 他のXMLスキーマでのXMLスキーマの再利用

    • 要素と属性の追加によるXMLスキーマの拡張

    • 同じ文書からの複数のXMLスキーマの参照

9.2 XML Schema Processorの使用: 概要

Oracle XML Schema ProcessorはSAXベースのXMLスキーマ・バリデータであり、XMLスキーマに対してインスタンス・ドキュメントが妥当かどうかを検証するために使用できます。プロセッサでは、LAnguage eXample (LAX)と厳密な検証の両方がサポートされています。

プロセッサは次の方法で使用できます。

  • XMLパーサーで有効にします。

  • DOMツリーで使用して、XML文書の全体または一部を検証します。

  • 処理パイプライン(コンテンツ・ハンドラなど)でコンポーネントとして使用します。

要件に応じて、様々な方法でSchema Processorを構成できます。たとえば、次の操作が可能です。

  • 固定のXMLスキーマを使用するか、インスタンス・ドキュメントのschemaLocation属性に基づいてスキーマを自動的に構築します。

  • 検証プロセスをより詳細に制御できるようにXMLErrorおよびentityResolverを設定します。

  • インスタンス・ドキュメントをどの程度検証するかを決定します。表4-1に示した検証モードのいずれかを使用できます。検証のルートとして要素の型を指定することもできます。

トピック:

9.2.1 XML Schema Processor for Javaの使用: 基本プロセス

XMLスキーマを処理するアプリケーションで重要なXDKパッケージについて説明します。

これらは、XMLスキーマを処理するアプリケーションで重要です。

  • XML解析用のAPIを提供するoracle.xml.parser.v2

  • XMLスキーマ処理用のAPIを提供するoracle.xml.parser.schema

表9-2に、oracle.xml.parser.schemaパッケージの最も重要なクラスを示します。これらのクラスは、ほとんどのXMLスキーマ・アプリケーションのコアを形成します。

表9-2 oracle.xml.parser.schemaのクラス

クラス/インタフェース 説明 メソッド

XMLSchemaクラス

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オブジェクトはXMLParserXMLDocumentのイベント・ハンドラ間にパイプライン・ノードとして挿入されます。

主要なメソッドは次のとおりです。

  • getCurrentMode()getElementDeclaration()などのgetメソッド。

  • setXMLProperty()setDocumentLocator()などのsetメソッド。

  • startDocument()は、文書の開始に関する通知を受け取ります。

  • startElement()は、要素の開始に関する通知を受け取ります。

図9-1に、XML Schema processor for Javaでインスタンス・ドキュメントを検証する基本プロセスを示します。

図9-1 XML Schema Processor for Java

図9-1の説明が続きます
「図9-1 XML Schema Processor for Java」の説明

XML Schema Processorは、次の主要タスクを実行します。

  1. ビルダー(XSDBuilderオブジェクト)が、入力XMLスキーマ文書からXMLスキーマを作成します。インスタンス・ドキュメントおよびスキーマは、特にオペレーティング・システムにファイルとして存在する必要はありませんが、一般にファイルと呼ばれます。これらは、バイト・ストリーム、データベース・レコードのフィールドまたはXML Infosetの情報項目のコレクションとして存在できます。

    このタスクには、スキーマ文書のオブジェクトへの解析が含まれます。ビルダーは、スキーマ・オブジェクトを明示的または暗黙的に作成します。

    • 明示的モードでは、プロセッサを起動するときにXMLスキーマを渡します。「外部参照XMLスキーマに対する検証」では、明示的モードでのスキーマ・オブジェクトの作成方法について説明しています。

    • 暗黙的モードでは、スキーマがインスタンス・ドキュメントにより内部的に参照されているため、プロセッサの起動時にXMLスキーマを渡しません。「内部参照XMLスキーマに対する検証」では、暗黙的モードでのスキーマ・オブジェクトの作成方法について説明しています。

  2. XMLスキーマ・バリデータでは、スキーマ・オブジェクトを使用してインスタンス・ドキュメントを検証します。このタスクの手順は次のとおりです。

    1. Simple API for XML (SAX)パーサーは、インスタンス・ドキュメントをSAXイベントに解析し、これをバリデータに渡します。

    2. バリデータは、SAXイベントを入力として受け取り、これらがスキーマ・オブジェクトに対して妥当かどうかを検証し、無効なXMLコンポーネントが見つかった場合はエラー・メッセージを送信します。

      「XMLパーサーでの検証」では、インスタンス・ドキュメントの検証時に使用できる検証モードについて説明しています。XSDBuilderクラスを使用して検証用のスキーマを明示的に設定しない場合は、インスタンス・ドキュメントで正しいxsi:schemaLocation属性がスキーマ・ファイルを指している必要があります。そうでない場合、プログラムは検証を実行しません。プロセッサでエラーが発生した場合は、エラー・メッセージが生成されます。

    3. バリデータは、入力SAXイベント、デフォルト値またはスキーマ検証後の情報をDOMビルダーまたはアプリケーションに送信します。

関連項目:

9.2.2 XML Schema Processorのデモ・プログラムの実行

XML Schema Processor for Javaのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/schemaに含まれています。

表9-3で、XML Schema Processorのテストに使用できるXMLファイルとプログラムについて説明します。

表9-3 XML Schemaのサンプル・ファイル

ファイル 説明
cat.xsd

catalogue.xmlを検証するためにXSDSetSchema.javaプログラムで使用されるサンプルXMLスキーマ。cat.xsdスキーマは、書籍のカタログの構造を指定します。

catalogue.xml

cat.xsdスキーマに対して妥当かどうかを検証するためにXSDSetSchema.javaプログラムで使用されるサンプル・インスタンス・ドキュメント。

catalogue_e.xml

XSDSample.javaプログラムで使用されるサンプル・インスタンス・ドキュメント。プログラムは、cat.xsdスキーマに対してこのドキュメントが妥当かどうかの検証を試行すると、スキーマ・エラーを生成します。

DTD2Schema.java

このサンプル・プログラムは、DTD(第1引数)をXML Schemaに変換し、これを使用してXMLファイル(第2引数)を検証します。

embeded_xsql.xsd

XSDLax.javaで使用されるXMLスキーマ。スキーマでは、XSQLページの構造を定義します。

embeded_xsql.xml

XSDLax.javaで使用されるインスタンス・ドキュメント。

juicer1.xml

xsdproperty.javaで使用するサンプルXML文書。この文書を定義するXMLスキーマはjuicer1.xsdです。

juicer1.xsd

xsdproperty.javaで使用するサンプルXMLスキーマ。このXMLスキーマは、juicer1.xmlを定義します。

juicer2.xml

xsdproperty.javaで使用するサンプルXML文書。この文書を定義するXMLスキーマはjuicer2.xsdです。

juicer2.xsd

xsdproperty.javaで使用するサンプルXML文書。このXMLスキーマは、juicer2.xmlを定義します。

report.xml

XMLスキーマreport.xsdに対して妥当かどうかを検証するためにXSDSetSchema.javaで使用されるサンプルXMLファイル。

report.xsd

report.xmlのコンテンツを検証するためにXSDSetSchema.javaプログラムで使用されるサンプルXMLスキーマ。report.xsdスキーマは、発注書の構造を指定します。

report_e.xml

プログラムは、XSDSample.javaを使用してこのサンプルXMLファイルを検証すると、XML 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.xsd

xsdent.xsdschemaLocation属性により参照されているXMLスキーマ文書。

xsdproperty.java

このデモは、複合型または要素宣言に基づいてXML文書を検証するようにXML Schema Processorを構成する方法を示します。

xsdsax.java

このデモは、SAXストリームとして受け取ったXML文書の検証方法を示します。

XSDLax.java

このデモは、XSDSetSchema.javaと同じですが、SCHEMA_LAX_VALIDATIONフラグをLAX検証用に設定します。

XSDSample.java

このプログラムは、XMLインスタンス・ドキュメントの処理に使用できるサンプル・ドライバです。

XSDSetSchema.java

このプログラムは、schemaLocationをオーバーライドすることでXMLインスタンス・ドキュメントを処理するためのサンプル・ドライバです。プログラムでは、cat.xsdのXML Schema仕様を使用して、catalogue.xmlのコンテンツを検証します。

サンプル・プログラムのコンパイル方法および実行方法は、同じディレクトリにあるREADMEに示されています。この場合、基本的な手順は次のようになります。

  1. ディレクトリを$ORACLE_HOME/xdk/demo/java/schemaディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\schemaディレクトリ(Windowsの場合)に変更します。
  2. コマンドラインでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行します。
  3. xmlparserv2.jarxschema.jarおよび現在のディレクトリをCLASSPATHに追加します。これらのJARファイルは$ORACLE_HOME/lib(UNIXの場合)および%ORACLE_HOME%\lib(Windowsの場合)にあります。たとえば、CLASSPATHは、UNIXのtcshシェルで次のように設定できます。
    setenv CLASSPATH
     "$CLASSPATH":$ORACLE_HOME/lib/xmlparserv2.jar:$ORACLE_HOME/lib/schema.jar:.

    注意:

    XML Schema ProcessorにはJDKバージョン1.2以降が必要であり、Java 1.2をサポートしている任意のオペレーティング・システムで使用できます。

  4. ディレクトリに含まれているXMLファイルを使用してサンプル・プログラムを実行します。
    • 次の例では、report.xsdを使用して、report.xmlのコンテンツを検証します。

      java XSDSample report.xml
      java XSDSetSchema report.xsd report.xml
      
    • 次の例では、Laxモードでインスタンス・ドキュメントを検証します。

      java XSDLax embeded_xsql.xsd embeded_xsql.xml
      
    • 次の例では、cat.xsdを使用して、catalogue.xmlのコンテンツを検証します。

      java XSDSample catalogue.xml
      java XSDSetSchema cat.xsd catalogue.xml
      
    • 次の例では、エラー・メッセージを生成します。

      java XSDSample catalogue_e.xml
      java XSDSample report_e.xml
      
    • 次の例では、xsdent.xsdschemaLocation属性を使用して、XMLスキーマを検証のためにxsdent-1.xsdにリダイレクトします。

      java xsdent xsdent.xml xsdent.xsd
      
    • 次の例では、report.xmlからSAXストリームを生成し、report.xsdで定義されているXMLスキーマに対して妥当かどうかを検証します。

      java xsdsax report.xsd report.xml
      
    • 次の例では、report.xmlのDOM表現を作成し、report.xsdで定義されているXMLスキーマに対して妥当かどうかを検証します。

      java xsddom report.xsd report.xml
      
    • 次の例では、要素宣言または複合型定義から開始する検証を構成します。

      java xsdproperty juicer1.xml juicer1.xsd http://www.juicers.org \
      juicersType false > juicersType.out
                                                                                             
      java xsdproperty juicer2.xml juicer2.xsd http://www.juicers.org \ 
      Juicers true > juicers_e.out
      
    • 次の例では、DTD (dtd2schema.dtd)をXMLスキーマに変換し、これを使用してインスタンス・ドキュメント(dtd2schema.xml)を検証します。

      java DTD2Schema dtd2schema.dtd dtd2schema.xml

9.2.3 XML Schema Processorコマンドライン・ユーティリティの使用

XML Parserコマンドライン・ユーティリティ(oraxml)を使用して、XMLスキーマとDTDに対してインスタンス・ドキュメントが妥当かどうかを検証できます。

トピック:

関連項目:

oraxmlの実行方法の説明は、「Java XML Parserコマンドライン・ユーティリティ(oraxml)の使用」を参照してください。

9.2.3.1 oraxmlを使用したスキーマに対する検証

次の例に、コマンドラインでoraxmlを起動して、文書report.xmlがXMLスキーマreport.xsdに対して妥当かどうかを検証する方法を示します。

例9-5 oraxmlを使用したスキーマに対する検証

このコマンドは、ディレクトリ$ORACLE_HOME/xdk/demo/java/schemaで起動します。

oraxml -schema -enc report.xml

予想される出力は次のとおりです。

The encoding of the input file: UTF-8
The input XML file is parsed without errors using Schema validation mode.
9.2.3.2 oraxmlを使用したDTDに対する検証

次の例に、コマンドラインでoraxmlを起動して、文書family.xmlがDTD family.dtdに対して妥当かどうかを検証する方法を示します。

例9-6 oraxmlを使用したDTDに対する検証

このコマンドは、ディレクトリ$ORACLE_HOME/xdk/demo/java/parser/commonで起動します。

oraxml -dtd -enc family.xml

予想される出力は次のとおりです。

The encoding of the input file: UTF-8
 The input XML file is parsed without errors using DTD validation mode.

9.3 XMLスキーマを使用したXMLの検証

次のトピックでは、XMLスキーマを使用してXML文書を検証する、様々な方法について説明します。

トピック:

9.3.1 内部参照XMLスキーマに対する検証

$ORACLE_HOME/xdk/demo/java/schema/XSDSample.javaは、暗黙的なXMLスキーマに対して妥当かどうかを検証する方法を示します。XMLスキーマはインスタンス・ドキュメント自体で参照されているため、検証モードは暗黙的です。

この項の手順に従って、oracle.xml.parser.v2.DOMParserクラスのsetValidationMode()メソッドを使用するプログラムを作成します。

  1. インスタンス・ドキュメントの検証に使用するDOMパーサーを作成します。XSDSample.javaの次のコード部分では、DOMParserオブジェクトの作成方法を示します。
    public class XSDSample
    {
       public static void main(String[] args) throws Exception
       {
          if (args.length != 1)
          {
             System.out.println("Usage: java XSDSample <filename>");
             return;
          }
          process (args[0]);
       }
    
       public static void process (String xmlURI) throws Exception
       {
          DOMParser dp  = new DOMParser();
          URL       url = createURL(xmlURI);
          ...
       }
    ...
    }
    

    createURL()は、プログラムに引数として渡されるファイル名からURLを構築するヘルパー・メソッドです。

  2. DOMParser.setValidationMode()メソッドを使用して検証DOMパーサーの検証モードを設定します。たとえば、XSDSample.javaはXMLスキーマ検証の指定方法を示します。
    dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);
    dp.setPreserveWhitespace(true);
    
  3. DOMParser.setErrorStream()メソッドを使用して出力エラー・ストリームを設定します。たとえば、XSDSample.javaはDOMパーサー・オブジェクトのエラー・ストリームを次のように設定します。
    dp.setErrorStream (System.out);
    
  4. DOMParser.parse()メソッドを使用してインスタンス・ドキュメントを検証します。スキーマはインスタンス・ドキュメントにより内部的に参照されているため、XMLスキーマ・オブジェクトを明示的に作成する必要はありません。たとえば、XSDSample.javaはインスタンス・ドキュメントを次のように検証します。
    try
    {
      System.out.println("Parsing "+xmlURI);
      dp.parse(url);
      System.out.println("The input file <"+xmlURI+"> parsed without errors");
    }
    catch (XMLParseException pe)
    {
      System.out.println("Parser Exception: " + pe.getMessage());
    }
    catch (Exception e)
    {
      System.out.println("NonParserException: " + e.getMessage());
    }

9.3.2 外部参照XMLスキーマに対する検証

$ORACLE_HOME/xdk/demo/java/schema/XSDSetSchema.javaは、XMLスキーマを明示的に検証する方法を示します。XSDBuilderクラスを使用して検証用のスキーマを指定するため、検証モードは明示的です。暗黙的な検証の場合とは異なり、スキーマはインスタンス・ドキュメントでは指定されません。

この項の基本手順に従って、oracle.xml.parser.schema.XSDBuilderクラスのbuild()メソッドを使用するJavaプログラムを作成します。

  1. XSDBuilder.build()メソッドを使用して、XMLスキーマ文書からXMLスキーマ・オブジェクトを作成します。XSDSetSchema.javaの次のコード部分は、オブジェクトの作成方法を示します。
    public class XSDSetSchema
    {
       public static void main(String[] args) throws Exception
       {
          if (args.length != 2)
          {
             System.out.println("Usage: java XSDSample <schema_file> <xml_file>");
             return;
          }
     
          XSDBuilder builder = new XSDBuilder();
          URL    url =  createURL(args[0]);
     
          // Build XML Schema Object
          XMLSchema schemadoc = (XMLSchema)builder.build(url);
          process(args[1], schemadoc);
       }
    . . .
    

    createURL()メソッドは、コマンドラインで指定されたスキーマ文書ファイル名からURLを構築するヘルパー・メソッドです。

  2. インスタンス・ドキュメントの検証に使用するDOMパーサーを作成します。XSDSetSchema.javaの次のコードは、インスタンス・ドキュメントのファイル名とXMLスキーマ・オブジェクトをprocess()メソッドに渡す方法を示します。
    public static void process(String xmlURI, XMLSchema schemadoc)throws Exception{
       DOMParser dp  = new DOMParser();
       URL       url = createURL (xmlURI);
       . . .
    
  3. DOMParser.setXMLSchema()メソッドを使用して、検証に使用するスキーマ・オブジェクトを指定します。暗黙的検証モードでは、インスタンス・ドキュメントがすでにスキーマを参照しているため、この手順は不要です。たとえば、XSDSetSchema.javaはスキーマを次のように指定します。
    dp.setXMLSchema(schemadoc);
    
  4. DOMParser.setValidationMode()メソッドを使用してDOMパーサー・オブジェクトの検証モードを設定します。たとえば、XSDSample.javaはXMLスキーマ検証の指定方法を示します。
    dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);
    dp.setPreserveWhitespace(true);
    
  5. DOMParser.setErrorStream()メソッドを使用してパーサーの出力エラー・ストリームを設定します。たとえば、XSDSetSchema.javaでは次のように設定します。
    dp.setErrorStream (System.out);
    
  6. DOMParser.parse()メソッドを使用して、インスタンス・ドキュメントがXMLスキーマに対して妥当かどうかを検証します。たとえば、XSDSetSchema.javaには次のコードが含まれます。
    try
    {
       System.out.println("Parsing "+xmlURI);
       dp.parse (url);
       System.out.println("The input file <"+xmlURI+"> parsed without errors");
    }
    catch (XMLParseException pe)
    {
       System.out.println("Parser Exception: " + pe.getMessage());
    }
    catch (Exception e)
    {
       System.out.println ("NonParserException: " + e.getMessage());
    }

9.3.3 XML文書のサブセクションの検証

LAXモードでは、XML文書全体を検証することなく、その一部を検証できます。LAX解析では、関連付けられたXMLスキーマで宣言されている文書内の要素が検証されます。プロセッサは、スキーマで宣言された要素がインスタンス・ドキュメントに含まれていない場合でも、そのインスタンス・ドキュメントを無効とみなしません。

LAXモードを使用することにより、XMLの検証対象部分に対してのみスキーマを定義できます。$ORACLE_HOME/xdk/demo/java/schema/XSDLax.javaプログラムは、LAX検証の使用方法を示します。このプログラムは、「外部参照XMLスキーマに対する検証」で説明している基本手順を実行します。

  1. ユーザー指定のXMLスキーマ文書から、XMLスキーマ・オブジェクトを作成します。
  2. インスタンス・ドキュメントの検証に使用するDOMパーサーを作成します。
  3. 検証に使用するXMLスキーマを指定します。
  4. DOMパーサー・オブジェクトの検証モードを設定します。
  5. パーサーの出力エラー・ストリームを設定します。
  6. DOMParser.parse()を起動することにより、XMLスキーマに対してインスタンス・ドキュメントが妥当かどうかを検証します。

LAX検証を有効にするには、パーサーの検証モードをSCHEMA_VALIDATIONではなくSCHEMA_LAX_VALIDATIONに設定します。XSDLax.javaの次のコード部分は、この方法を示します。

dp.setXMLSchema(schemadoc);
dp.setValidationMode(XMLParser.SCHEMA_LAX_VALIDATION);
dp.setPreserveWhitespace (true);
. . .

サンプル・プログラムを次のように実行することにより、LAX検証をテストできます。

java XSDLax embeded_xsql.xsd embeded_xsql.xml

9.3.4 SAXストリームからのXMLの検証

$ORACLE_HOME/xdk/demo/java/schema/xsdsax.javaは、SAXストリームとして受け取ったXML文書を検証する方法を示します。XSDValidatorをインスタンス化し、SAXパーサーにコンテンツ・ハンドラとして登録します。

この項の手順に従って、SAXストリームからXMLを検証するプログラムを作成します。

  1. XSDBuilder.build()メソッドを起動することにより、ユーザー指定のXMLスキーマ文書からXMLスキーマ・オブジェクトを作成します。次のコード部分は、オブジェクトの作成方法を示します。
    XSDBuilder builder = new XSDBuilder();
    URL    url =  XMLUtil.createURL(args[0]);
    
    // Build XML Schema Object
    XMLSchema schemadoc = (XMLSchema)builder.build(url);      
    process(args[1], schemadoc);
    . . .
    

    createURL()は、コマンドラインで指定されたファイル名からURLを作成するヘルパー・メソッドです。

  2. インスタンス・ドキュメントの検証に使用するSAXパーサー(SAXParserオブジェクト)を作成します。saxxsd.javaの次のコード部分は、XML文書とスキーマ文書へのハンドルをprocess()メソッドに渡します。
    process(args[1], schemadoc);...public static void process(String xmlURI, XMLSchema schemadoc)
    throws Exception 
    {
        SAXParser dp  = new SAXParser();
    ...
    
  3. SAXパーサーを構成します。次のコード部分は、XSDBuilder.setValidationMode()メソッドを使用してSAXパーサー・オブジェクトの検証モードを設定します。
    dp.setPreserveWhitespace (true);
    dp.setValidationMode(XMLParser.NONVALIDATING);
    
  4. バリデータ(XSDValidatorオブジェクト)を作成して構成します。次のコード部分で、この方法を示します。
    XMLError err;... err = new XMLError();
    ...
    XSDValidator validator = new XSDValidator();
    ...
    validator.setError(err);
    
  5. XSDBuilder.setXMLProperty()メソッドを起動することにより、検証に使用するXMLスキーマを指定します。最初の引数はプロパティの名前(fixedSchema)で、2番目の引数はXMLスキーマ・オブジェクトへの参照です。次のコード部分で、この方法を示します。
    validator.setXMLProperty(XSDNode.FIXED_SCHEMA, schemadoc);
    ...
    
  6. バリデータをパーサーのSAXコンテンツ・ハンドラとして登録します。次のコード部分で、この方法を示します。
    dp.setContentHandler(validator);
    ...
    
  7. SAXParser.parse()メソッドを起動することにより、インスタンス・ドキュメントがXMLスキーマに対して妥当かどうかを検証します。次のコード部分で、この方法を示します。
    dp.parse (url);

9.3.5 DOMからのXMLの検証

$ORACLE_HOME/xdk/demo/java/schema/xsddom.javaは、ドキュメントのDOM表現を取得し、XSDValidatorオブジェクトを使用してこれを検証することにより、インスタンス・ドキュメントを検証する方法を示します。

xsddom.javaプログラムは次の手順を実行します。

  1. XSDBuilder.build()メソッドを起動することにより、ユーザー指定のXMLスキーマ文書からXMLスキーマ・オブジェクトを作成します。次のコード部分は、オブジェクトの作成方法を示します。
    XSDBuilder builder = new XSDBuilder();
    URL    url =  XMLUtil.createURL(args[0]);
    
    XMLSchema schemadoc = (XMLSchema)builder.build(url);      
    process(args[1], schemadoc);
    

    createURL()は、コマンドラインで指定されたファイル名からURLを作成するヘルパー・メソッドです。

  2. インスタンス・ドキュメントの検証に使用するDOMパーサー(DOMParserオブジェクト)を作成します。domxsd.javaの次のコード部分は、XML文書とスキーマ文書へのハンドルをprocess()メソッドに渡します。
    process(args[1], schemadoc);...public static void process(String xmlURI, XMLSchema schemadoc)
    throws Exception 
    {
        DOMParser dp  = new DOMParser();
        . . .
    
  3. DOMパーサーを構成します。次のコード部分は、DOMParser.setValidationMode()メソッドを使用してパーサー・オブジェクトの検証モードを設定します。
    dp.setPreserveWhitespace (true);
    dp.setValidationMode(XMLParser.NONVALIDATING);
    dp.setErrorStream (System.out);
    
  4. インスタンス・ドキュメントを解析します。次のコード部分で、この方法を示します。
    dp.parse (url);
    
  5. 入力文書のDOM表現を取得します。次のコード部分で、この方法を示します。
    XMLDocument doc = dp.getDocument();
    
  6. バリデータ(XSDValidatorオブジェクト)を作成して構成します。次のコード部分で、この方法を示します。
    XMLError err;... err = new XMLError();
    ...
    XSDValidator validator = new XSDValidator();
    ...
    validator.setError(err);
    
  7. XSDBuilder.setXMLProperty()メソッドを起動することにより、検証に使用するスキーマ・オブジェクトを指定します。最初の引数はプロパティの名前(この例ではfixedSchema)で、2番目の引数はスキーマ・オブジェクトへの参照です。次のコード部分で、この方法を示します。
    validator.setXMLProperty(XSDNode.FIXED_SCHEMA, schemadoc);
    . . .
    
  8. DOMツリーのルート要素(XMLElement)を取得し、検証します。次のコード部分で、この方法を示します。
    XMLElement root = (XMLElement)doc.getDocumentElement();
    XMLElement copy = (XMLElement)root.validateContent(validator, true);
    copy.print(System.out);

9.3.6 設計した型および要素からのXMLの検証

$ORACLE_HOME/xdk/demo/java/schema/xsdproperty.javaは、複合型または要素宣言に基づいてXML文書を検証するようにXML Schema Processorを構成する方法を示します。

xsdproperty.javaプログラムは次の手順を実行します。

  1. インスタンス・ドキュメント名、XMLスキーマ名、ルート・ノードの名前空間、ルート・ノードのローカル名、および要素または複合型の指定("true"はルート・ノードが要素宣言であることを意味します)に関するStringオブジェクトを作成します。次のコード部分で、この方法を示します。

    String xmlfile = args[0];
    String xsdfile =  args[1];
    ...
    String ns = args[2]; //namespace for the root node
    String nm = args[3]; //root node's local name
    String el = args[4]; //true if root node is element declaration, 
                         // otherwise, the root node is a complex type
    
  2. XSDビルダーを作成し、それを使用してスキーマ・オブジェクトを作成します。次のコード部分で、この方法を示します。

    XSDBuilder builder = new XSDBuilder();
    URL    url =  XMLUtil.createURL(xsdfile);       
    XMLSchema  schema;
    ...
    schema = (XMLSchema) builder.build(url);
    
  3. ノードを取得します。ノードが要素宣言と複合型のどちらであるかに応じて異なるメソッドを起動します。

    • ノードが要素宣言である場合は、ローカル名と名前空間をスキーマ・オブジェクトのgetElement()メソッドに渡します。

    • ノードが要素宣言である場合は、名前空間、ローカル名およびルート複合型をスキーマ・オブジェクトのgetType()メソッドに渡します。

    xsdproperty.javaは、次の制御構造を使用します。

    QxName qname = new QxName(ns, nm);
    ...
    XSDNode nd;
    ...
    if (el.equals("true"))
    {
      nd = schema.getElement(ns, nm);
      /* process ... */
    }
    else
    {
      nd = schema.getType(ns, nm, XSDNode.TYPE);
      /* process ... */
    }
    
  4. ノードを取得した後で、新規パーサーを作成し、スキーマをパーサーに設定してスキーマ検証を有効にします。次のコード部分で、この方法を示します。

    DOMParser dp  = new DOMParser();
    URL       url = XMLUtil.createURL (xmlURI);
    
  5. パーサー上のプロパティを設定し、URLを解析します。schemaValidatorProperty()メソッドを起動します。

    1. パーサーのルート要素または型プロパティを完全修飾名に設定します。

      最上位レベルの要素宣言では、process1()メソッドで示されているように、プロパティ名をXSDNode.ROOT_ELEMENTに設定し、値をQNameに設定します。

      最上位レベルの型定義では、process2()メソッドで示されているように、プロパティ名をXSDNode.ROOT_TYPEに設定し、値をQNameに設定します。

    2. パーサーのルート・ノード・プロパティを要素または複合型ノードに設定します。

      要素ノードでは、process3()メソッドで示されているように、プロパティ名をXSDNode.ROOT_NODEに設定し、値をXSDElementノードに設定します。

      型ノードでは、process3()メソッドで示されているように、プロパティ名をXSDNode.ROOT_NODEに設定し、値をXSDComplexTypeノードに設定します。

    次のコード部分はメソッドの起動順序を示します。

    if (el.equals("true"))
    {
       nd = schema.getElement(ns, nm);
       process1(xmlfile, schema, qname);
       process3(xmlfile, schema, nd);
    }
    else
    {
       nd = schema.getType(ns, nm, XSDNode.TYPE);
       process2(xmlfile, schema, qname);
       process3(xmlfile, schema, nd);
    }
    

    処理メソッドは次のように実装されます。

      static void process1(String xmlURI, XMLSchema schema, QxName qname)
          throws Exception
      {
        /* create parser... */
        dp.setXMLSchema(schema);
        dp.setSchemaValidatorProperty(XSDNode.ROOT_ELEMENT, qname);
        dp.setPreserveWhitespace (true);
        dp.setErrorStream (System.out);
        dp.parse (url);
        ...
      }
                                                                                                 
      static void process2(String xmlURI, XMLSchema schema, QxName qname)
          throws Exception
      {
          /* create parser... */                                                                                        
        dp.setXMLSchema(schema);
        dp.setSchemaValidatorProperty(XSDNode.ROOT_TYPE, qname);
        dp.setPreserveWhitespace (true);
        dp.setErrorStream (System.out);
        dp.parse (url);
        ...
      }
                                                                                                 
      static void process3(String xmlURI, XMLSchema schema, XSDNode node)
          throws Exception
      {
          /* create parser... */
                                                                                                  
        dp.setXMLSchema(schema);
        dp.setSchemaValidatorProperty(XSDNode.ROOT_NODE, node);
        dp.setPreserveWhitespace (true);
        dp.setErrorStream (System.out);
        dp.parse (url);
        ...
      }

9.4 XMLスキーマを使用したプログラミングのヒントと方法

次のトピックでは、スキーマの場所のオーバーライド、およびDTDからXMLスキーマへの変換について説明します。

トピック:

9.4.1 エンティティ・リゾルバによるスキーマの場所のオーバーライド

XSDBuilderは、スキーマを構築する場合に、schemaLocation属性でURLとして指定された他のスキーマを組み込みまたはインポートすることが必要な場合があります。場合によっては、<import>で指定したスキーマの場所をオーバーライドし、必要なスキーマ・ドキュメントをビルダーに提供することが必要になります。

表9-3に示されているxsdent.javaデモは、schemaLocationに指定されているスキーマをインポートする必要がある場合を示しています。xsdent.xmlファイルの文書要素には、次の属性が含まれます。

xsi:schemaLocation =  "http://www.example.com/BookCatalogue
                       xsdent.xsd">

xsdent.xsd文書には、次の要素が含まれます。

<schema xmlns="http://www.w3.org/2001/XMLSchema"
               targetNamespace="http://www.example.com/BookCatalogue"
               xmlns:catd = "http://www.example.com/Digest"
               xmlns:cat  = "http://www.example.com/BookCatalogue"
               elementFormDefault="qualified">
<import namespace = "http://www.example.com/Digest"
        schemaLocation = "xsdent-1.xsd" />

<import>で指定したスキーマの場所をオーバーライドし、必要なスキーマ・ドキュメントをビルダーに提供する場合の例として、外部Webサイトからスキーマ・ドキュメントをダウンロードしてデータベースに格納する場合などがあります。このような場合は、XSDBuilderにエンティティ・リゾルバを設定できます。XSDBuilderは、スキーマの場所をリゾルバに渡します。リゾルバは、InputStreamReaderまたはURLInputSourceとして戻します。ビルダーは、InputSourceからスキーマ・ドキュメントを読み取ることができます。

xsdent.javaプログラムは、エンティティ・リゾルバを使用してスキーマの場所をオーバーライドする方法を示します。EntityResolverインタフェースを実装し、エンティティ・リゾルバをインスタンス化し、それをXMLスキーマ・ビルダーに設定する必要があります。デモ・コードでは、sampleEntityResolver1InputSourceInputStreamとして戻しますが、sampleEntityResolver2InputSourceURLとして戻します。

次の基本手順に従います。

  1. 新規XMLスキーマ・ビルダーを次のように作成します。
    XSDBuilder builder = new XSDBuilder(); 
       
  2. ビルダーをエンティティ・リゾルバに設定します。エンティティ・リゾルバは、EntityResolverインタフェースを実装するクラスです。リゾルバの目的は、XMLリーダーが、外部エンティティを組み込む前に、それらのエンティティをインターセプトできるようにすることです。次のコード部分は、エンティティ・リゾルバを作成し、それをビルダーに設定します。
    builder.setEntityResolver(new sampleEntityResolver1());
    

    sampleEntityResolver1クラスは、resolveEntity()メソッドを実装します。このメソッドを使用して、外部システム識別子をローカルURIにリダイレクトできます。ソース・コードは次のとおりです。

    class sampleEntityResolver1 implements EntityResolver
    {
       public InputSource resolveEntity (String targetNS,  String systemId)
       throws SAXException, IOException
       {
          // perform any validation check if needed based on targetNS & systemId 
          InputSource mySource = null;
          URL u = XMLUtil.createURL(systemId); 
          // Create input source with InputStream as input
          mySource = new InputSource(u.openStream());
          mySource.setSystemId(systemId);
          return mySource;
       }
    }
    

    sampleEntityResolver1クラスはInputSourceをストリームで初期化します。

  3. XMLスキーマ・オブジェクトを作成します。次のコードで、この方法を示します。
    schemadoc = builder.build(url);
    
  4. XMLスキーマに対してインスタンス・ドキュメントが妥当かどうかを検証します。プログラムは次の文を実行します。
    process(xmlfile, schemadoc);
    

    process()メソッドはDOMパーサーを作成して構成し、parse()メソッドを起動します。メソッドは次のように実装されます。

    public static void process(String xmlURI, Object schemadoc)
        throws Exception
    {
      DOMParser dp  = new DOMParser();
      URL       url = XMLUtil.createURL (xmlURI);
     
      dp.setXMLSchema(schemadoc);
      dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);
      dp.setPreserveWhitespace (true);
      dp.setErrorStream (System.out);
      try {
         dp.parse (url);
         ...
    }

9.4.2 DTDからXMLスキーマへの変換

XML Schema言語の機能と柔軟性を利用して、既存のDTDをXML Schema文書に変換できます。XDKを使用してこの変換を実行できます。

$ORACLE_HOME/xdk/demo/java/schema/DTD2Schema.javaプログラムは、DTDの変換方法を示します。次のようにしてプログラムをテストできます。

java DTD2Schema dtd2schema.dtd dtd2schema.xml

次の基本手順に従って、DTDをXMLスキーマ文書に変換します。

  1. DOMParser.parseDTD()メソッドを使用してDTDを解析します。DTD2Schema.javaの次のコード部分は、DTDオブジェクトの作成方法を示します。
    XSDBuilder builder = new XSDBuilder(); 
    URL dtdURL = createURL(args[0]);
    DTD dtd = getDTD(dtdURL, "abc");
       

    getDTD()メソッドは次のように実装されます。

    private static DTD getDTD(URL dtdURL, String rootName)
       throws Exception
    {
       DOMParser parser = new DOMParser();
       DTD dtd;
       parser.setValidationMode(true);
       parser.setErrorStream(System.out);
       parser.showWarnings(true);
       parser.parseDTD(dtdURL, rootName);
       dtd = (DTD)parser.getDoctype();
       return dtd;
    }
    
  2. DTD.convertDTD2Sdhema()メソッドを使用して、DTDをXMLスキーマのDOMツリーに変換します。DTD2Schema.javaの次のコード部分は、この方法を示します。
    XMLDocument dtddoc = dtd.convertDTD2Schema();
    
  3. XMLDocument.print()メソッドを使用して、XMLスキーマのDOMツリーを出力ストリームに書き出します。DTD2Schema.javaの次のコード部分は、この方法を示します。
    FileOutputStream fos = new FileOutputStream("dtd2schema.xsd.out");
    dtddoc.print(fos);
    
  4. XSDBuilder.build()メソッドを使用して、スキーマのDOMツリーからXMLスキーマ・オブジェクトを作成します。DTD2Schema.javaの次のコード部分は、この方法を示します。
    XMLSchema schemadoc = (XMLSchema)builder.build(dtddoc, null);
    
  5. DOMParser.parse()メソッドを使用して、インスタンス・ドキュメントがXMLスキーマに対して妥当かどうかを検証します。DTD2Schema.javaの次のコード部分は、この方法を示します。
    validate(args[1], schemadoc);
    

    validate()メソッドは次のように実装されます。

    DOMParser dp  = new DOMParser();
    URL       url = createURL (xmlURI); 
    dp.setXMLSchema(schemadoc);
    dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);
    dp.setPreserveWhitespace (true);
    dp.setErrorStream (System.out);
    try
    {
       System.out.println("Parsing "+xmlURI);
       dp.parse (url);
       System.out.println("The input file <"+xmlURI+"> parsed without errors");
    }
    ...