6.11 javax.xml.validationパッケージに関する注意事項

javax.xml.validationパッケージに関する注意事項を次の表に示します。

表6-20 javax.xml.validationパッケージに関する注意事項

項番注意事項
1マルチスレッドプログラミングをする場合,SchemaFactoryクラス,Validatorクラス,ValidatorHandlerクラス,TypeInfoProviderクラスはスレッドセーフではありません。したがって,各スレッドは排他的にこれらのオブジェクトにアクセスするようにしてください。
2SchemaFactoryクラスのnewInstance(String schemaLanguage)メソッドの引数に指定可能なURIは"http://www.w3.org/2001/XMLSchema"だけです。
3SchemaFactoryクラスのisSchemaLanguageSupportedメソッドには,
"http://www.w3.org/2001/XMLSchema"を指定してください。その他のスキーマ言語を指定した場合は,falseが戻ります。
4SchemaFactoryクラスのnewSchema(Source[] schemas)メソッドの引数schemasの配列要素には,それぞれ異なるtargetNamespaceを持つスキーマ文書を指定してください。同一のtargetNamespaceを持つスキーマ文書,またはtargetNamespaceを持たないスキーマ文書を複数個指定すると,インデックスの小さい配列要素のスキーマ文書が優先されます。
5次の条件でSchemaFactoryクラスのnewSchema(Source[] schemas)メソッドを実行すると,例外が発生しない場合があります。
  • 引数schemasの配列要素が,正しいスキーマ文書と不正なスキーマ文書の両方を含んでいる。
この問題は,次のようにして回避できます。
  1. SchemaFactoryオブジェクトのエラーハンドラで,error, fatalErrorメソッドに渡される例外オブジェクトを保存しておく。
  2. newSchemaメソッドの呼び出し後に,1.で例外オブジェクトが保存されたかどうかチェックして,保存されていればその例外オブジェクトをスローする。
6Validatorクラスのvalidate(Source),validate(Source, Result)の引数には,表6-21に示す組み合わせで指定してください。
7Validatorクラスのvalidateメソッドによって,ID型の属性の定義を含むスキーマ文書を用いてXML文書を検証する場合は,validate(DOMSource, DOMResult)ではなく,validate(SAXSource),validate(DOMSource),validate(SAXSource, SAXResult)のどれかのメソッドを使用してください。
8次の条件がすべて重なるとき,Validatorクラスのvalidate(Source source, Result result)メソッドを実行すると,DOMException例外が発生する場合があります。
  1. 引数resultがDOMResultオブジェクトである。
  2. DOMResultオブジェクトに設定された「結果ツリーを含むDOMノード」が子ノードを持つDocumentオブジェクトである。
したがって,2.のDocumentオブジェクトには子ノードを持たせないようにしてください。
9スキーマ文書の中にxsd:ENTITY型,およびxsd:ENTITIES型が含まれるとき,ValidatorHandlerクラスを用いたスキーマ検証はサポートしていません。このような場合は,例えばValidatorクラスなどのほかの方法でスキーマ検証するようにしてください。
10スキーマ文書で定義されていない要素および属性から取得したTypeInfoオブジェクトは,妥当性検証失敗時には,xsd:anyType型のTypeInfoオブジェクトと同じになります。
11Validatorクラスのvalidate(Source)およびvalidate(Source, Result)の引数SourceにDOMSourceオブジェクトを指定する場合,DOMSourceオブジェクトが保持するNodeオブジェクトは,次に示すすべての条件に従う必要があります。
  1. 名前空間を有効に設定したパーサによって生成されている。
    例えば,setNamespaceAware(true)を適用したDocumentBuilderFactoryで生成したDocumentBuilderなど。
  2. 妥当性検証をしないパーサによって生成されている。
    例えば,setValidating (false)を適用したDocumentBuilderFactoryで生成したDocumentBuilderなど。
12Validatorクラスのvalidate(Source),validate(Source, Result)の引数SourceにSAXSourceオブジェクトを指定する場合に,そのSAXSourceオブジェクトがXMLReaderオブジェクトを使用するとき,XMLReaderオブジェクトは次に示すすべての条件に従う必要があります。
  1. 名前空間を有効に設定したXMLReaderオブジェクトである。
    例えば,setNamespaceAware(true)を適用したSAXParserFactoryでSAXParserを生成し,そのSAXParserから取り出したXMLReaderオブジェクトなど。
  2. 妥当性検証をしないXMLReaderオブジェクトである。
    例えば,setValidating (false)を適用したSAXParserFactoryでSAXParserを生成し,そのSAXParserから取り出したXMLReaderオブジェクトなど。
13次の条件がすべて重なるとき,例外コードがNO_MODIFICATION_ALLOWED_ERRであるDOMException例外が発生する場合があります。
  1. SchemaFactoryクラスのnewSchema(Source)およびnewSchema(Source[])の引数にDOMSourceオブジェクトを指定して,これらのメソッドを実行する。
  2. 1.のDOMSourceオブジェクトがラップしているDOMツリーを更新する。
14javax.xml.validation.SchemaFactoryクラスのnewSchemaメソッドに,XMLReaderを設定したSAXSourceを指定する場合,指定するXMLReaderは次の条件に従う必要があります。
  • SAX2のフィーチャー"http://xml.org/sax/features/namespace-prefixes"の値が"true"である。

表6-21 Validatorクラスのvalidate(Source),validate(Source, Result)の引数の組み合わせ

引数Result引数Source
SAXSourceDOMSourceStreamSourcenull
SAXResult×××
DOMResult×××
StreamResult××××
null××
(凡例)
○:組み合わせることができます。
×:組み合わせることはできません。