6

私はxml検証をしようとしています。実行時にスキーマのリストが与えられています (おそらく jar にラップされています)。検証は、スキーマを SchemaFactory に提供する順序に基づいて成功または失敗します。

これが私がやっていることです:

  private void validateXml(String xml, List<URI> schemas){
        Source[] source = new StreamSource[schemas.size()];
        int i=0;
        for (URI f : schemas){
           source[i++] = new StreamSource(f.openStream());
        }

        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NA_URI);
        sf.setResourceResolver(new MyClassPathResourceResolver());

        Schema schema = schemaFactory.newSchema(source);
        Validator validator = schema.newValidator();
        validator.validate(new StreamSource(new ByteArrayInputStream(xml.getBytes()));

渡されたスキーマのセットが、xml のルート要素が参照するスキーマで始まらない場合、これも失敗します。これに対する修正はありますか、それとも何か間違っていますか?

4

2 に答える 2

5

デフォルトでは、Xercesは、同じ名前空間のスキーマドキュメントを既に持っている場合、スキーマドキュメントを無視します。この動作は、ファクトリオプションを使用して変更できます

http://apache.org/xml/features/validation/schema/handle-multiple-imports

于 2012-08-07T20:16:25.997 に答える
0

まず、registerErrorHandler() メソッドを呼び出して、XML リーダーに org.xml.sax.ErrorHandler オブジェクトのインスタンスを設定する必要があります。問題についての手がかりを与える警告が表示される場合があります。

次に、使用している xml ライブラリを知っておく必要があります。コードで schemaFactory.getClass().getName() を呼び出して出力します。ライブラリを理解したら、複数のスキーマのインポートをオン/オフする機能をサポートしている場合は、そのドキュメントを参照できます。

于 2012-08-28T09:49:38.250 に答える