15

RELAX NGスキーマを使用してXMLドキュメントを検証したいのですが、JAXP検証APIを使用したいと思います。

グーグルの周りから、私はJingISORELAXJARVをJAXPブリッジに使用できるように見えました。残念ながら、両方をクラスパスに追加した後、それを機能させることができません。ファクトリをインスタンス化しようとするとすぐにをSchemaFactoryスローします—内部を調べたところ、明らかにnullの結果が返されています。IllegalArgumentExceptionSchemaFactorySchemaFactoryFinder

だから私はどちらかの質問への答えをいただければ幸いです:

  • Jingとこのブリッジでこれを機能させるにはどうすればよいですか?
  • 私が試してみるべきより良い/異なるライブラリのセットはありますか?

Java5とJava6で動作するためにこれが必要です。

ありがとう!

4

5 に答える 5

13

次の行を使用して、Java1.6でこのエラーを解決しました。

// Specify you want a factory for RELAX NG "compact"
System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory");

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);

これにより、Jingを使用してXMLドキュメントをCompactRELAXNGスキーマに対して検証できます。以下の完全な例。橋などは使いませんでした。ランタイムクラスパスには、jing.jar(20091111)と私自身のValidatorクラスのみが含まれます。

import java.io.File;
import java.io.IOException;

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;

public class Validate
{

    public static void main(String[] args) throws SAXException, IOException
    {
        // Specify you want a factory for RELAX NG
        System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory");
        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);

        // Load the specific schema you want.
        // Here I load it from a java.io.File, but we could also use a
        // java.net.URL or a javax.xml.transform.Source
        File schemaLocation = new File(args[0]);

        // Compile the schema.
        Schema schema = factory.newSchema(schemaLocation);

        // Get a validator from the schema.
        Validator validator = schema.newValidator();

        for (int i = 1; i < args.length; i++)
        {
            String file = args[i];

            // Check the document
            try
            {
                validator.validate(new StreamSource(new File(file)));
                System.out.println(file + " is valid.");
            }
            catch (SAXException ex)
            {
                System.out.print(file + " is not valid because: " + ex.getMessage());
            }
        }
    }

}

繰り返しになりますが、私はこのionJava1.6のみをテストしました。

$ java -version
java version "1.6.0_01"
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)
于 2010-01-20T19:39:17.050 に答える
9

RELAX NG Validation in XMLUnitというタイトルの 2008 年 3 月 7 日に書かれた Stefan Bodewig の Weblog を参照してください。

昨夜以来、XMLUnit のトランクには、JAXP 1.3 (つまり Java5+) の一部である javax.xml.validation に基づく新しい Validator クラスが含まれています。

...

私の知る限り、そのままで RELAX NG をサポートする JAXP 実装はありません。Sun 独自の JAXP 1.4 (Java6+) は確かにそうではありません。いろいろ調べたところ、JAXP、Sun の Multi Schema Validator、isorelax などに関する彼の仕事を考えると、Kohsuke Kawaguchi のブログにたどり着きました。

彼のisorelax-bridgeJingを使用しても、Java6 ではうまくいきませんでした。Kohsuke Kawaguchi の記事に戻ってコメントを読みました。Java6 では SchemaFactory ルックアップ アルゴリズムが変更されたため、ブリッジは機能しません。OK、代わりにJava5を試してみました-進行中、JingのどこかでNullPointerExceptionが発生するようになったので、少なくともファクトリをロードしています。次に、Jing を MSV に置き換えました (これは今ここにあります。Sun の WebServices スタック ページに誘導するリンクがいくつあっても、「良い URL は決して変わらない」ためです)。実際、単純なテストに合格しました。

したがって、RELAX NG サポートを JAXP セットアップに組み込むには、いくつかのフープをジャンプする必要がある場合があります-私の場合、Java5、MSV、および川口のブリッジは機能しましたが、コメントは、Java6 でも実行できるはずであることを示しています-しかし、すべてを構成することができたらXMLUnit があれば、ユニット テストでドキュメントの有効性を確認できます。ただし、コンパクトな構文では機能しないようです。

Kohsuke Kawaguchi のブログのコメントを読むには、archive.orgを使用する必要があります。

Java 5 は、Service Provider ファイルをキーと値のペアのリストとして解釈します。これは、Java 5 & 6 JAR ファイル仕様に違反していますが、たまたまあなたの例と一致しています。

Java 6 は、指定されたとおりにサービス プロバイダ ファイルを解析します。完全修飾クラス名のリストとして提供されますが、サービス プロバイダ ファイルの内容が無効であるため、アダプタの SchemaFactory のインスタンス化に失敗します。

JAXP-JARV-adapter JAR ファイルを変更せずに Java 5 と Java 6 の両方と互換性を持たせるには、正しい javax.xml.validation.SchemaFactory サービス プロバイダー ファイルを含む別の JAR ファイルを追加するだけです。

于 2009-10-21T04:42:44.387 に答える
1

JAXP 検証 API についてはお手伝いできませんが、Nuxには、既知のほぼすべてのタイプのスキーマを検証できるクラスが用意されています。RELAX NG スキーマに関しては、このファクトリ メソッドを使用して、関連するバリデータ オブジェクトを作成します。

于 2009-10-20T21:36:04.070 に答える
1

もう 1 つのオプションは、RelaxNG から XMLSchema へのトランスレーターであるTrangです。ランタイム ライブラリではなくビルド ツールとして使用するように設計されていると思いますが、ビルド時に Trang を使用してスキーマを XMLSchema に変換し、代わりにそれに対して検証することをお勧めします。そうすれば、JAXP の XML スキーマ サポートを最大限に活用しながら、翻訳がどのように見えるかを正確に確認できます。

于 2009-10-20T21:48:51.317 に答える
0

...ファクトリをインスタンス化しようとするとすぐに IllegalArgumentException が発生する

スキーマ言語が認識されていないことを意味します。いくつかの原因が考えられます。

  • Sun JDK にはデフォルトで RELAX NG バリデータが含まれていないため、見つからない可能性があります。
  • スキーマ言語識別子に誤りがある可能性があります。
于 2009-10-18T21:02:23.717 に答える