倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Schema オブジェクトの取得

javax.xml.validation パッケージ内のクラスは、XML の妥当性検証を行うためのクラス群が定義されています。 妥当性検証に用いることができるスキーマ言語は、デフォルトでは W3C XML Schema のみです(Java SE 6 現在)。

妥当性検証を行う方法には、以下のものがあります:

  • SAXParser, DocumentBuilder の処理時に妥当性検証を行う
  • Validator オブジェクトを用いて妥当性検証を行う
  • ValidatorHandler オブジェクトを用いて妥当性検証を行う

javax.xml.validation.Schema オブジェクトの取得


上記のどの方法を用いる場合でも、まず Schema オブジェクトを取得する必要があります。 ただし、Schema クラスを直接コンストラクタでインスタンス化することはできません。 Schema オブジェクトの取得には、以下の手順を踏みます*1

  1. static メソッド SchemaFactory#newInstance(String) によって SchemaFactory オブジェクトを取得する
  2. インスタンスメソッド SchemaFactory#newSchema(Source) によって Schema オブジェクトを取得する

具体的には、"test.xsd" というファイルに W3C XML Schema を用いてスキーマ定義が書かれている場合、

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
...

// 1. SchemaFactory オブジェクトを取得する
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

//2. Schema オブジェクトを取得する
Schema schema = factory.newSchema(new StreamSource("test.xsd"));

のようにします。 幾つか注意を:

  • SchemaFactory#newInstance(String) に渡している文字列は、スキーマ言語を特定する文字列です。 W3C XML SchemaRELAX NG ではそれぞれの名前空間 URI が用いられています。
  • SchemaFactory から Shema オブジェクトを取得するメソッド newSchema() には、Source オブジェクト以外にも、java.io.File オブジェクトや java.net.URL オブジェクトを受け取るものもあります。

*1:これは、Schema クラスや SchemaFactory クラスの実装を隠蔽するためです。 同様の方法でインスタンスを取得する XML の処理系が幾つかあります。 具体的には、javax.xml.parsers.SAXParser, javax.xml.parsers.DocumentBuilder, javax.xml.transform.Transformer, javax.xml.xpath.XPath などです。