7

XMLメッセージでいくつかの検証を行うことができるように、かなり複雑なXMLスキーマをJavaのSchemaオブジェクトに解析ロードしようとしています。

私のコードは次のようになります。

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new StreamSource(new File("schema/schema.xsd")));

私のスキーマにはかなりの数のインポートがあります:

<?xml version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="base_1">
  <xs:import namespace="base_1" schemaLocation="common/MessageBase.xsd"/>
</xs:schema>

...等。スキーマをロードしようとすると、多くのエラーが発生します。これに関連する別の質問に基づいて、リソースリゾルバーを指定する必要があるように見えますが、これはデフォルトで処理する必要があるものではありませんか?

もしそうなら、私が書いているアプリケーションを実行する場所またはベーススキーマファイルに相対的な場所にスキーマを配置する必要がある特定のディレクトリはありますか?

最後に、XMLSpy などでスキーマをロードすると、問題なく動作し、XML インスタンスを問題なく検証できます。

4

3 に答える 3

9

ベースの場所を指定せずに StreamSource を使用することが問題の原因だと思います。

パーサーは、メイン スキーマがどこにあるかを知る方法がないため、common/MessageBase.xml を解決できません。

2 つの引数のコンストラクターを使用して、開始元のパス名である SystemID を渡します。

StreamSource の javadoc を参照してください。

于 2009-11-13T22:53:42.483 に答える
2

インポートされた XSD を解決するには、スキーマ ファクトリをリソース リゾルバーに関連付ける必要があります。

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
factory.setResourceResolver(new MyResourceResolver());
Schema schema = factory.newSchema(new StreamSource(new File("schema/schema.xsd")));

詳細については、この回答をご覧ください。

于 2013-08-21T10:59:26.170 に答える