1

catalog.xml にリストされている .xsd ファイルを使用していくつかの xml ファイルを検証する必要がありますが、それらはデータベースにあります。そのため、catalog.xml の systemId とデータベースに blob として保存されている .xsd ファイルを一致させるリゾルバーが必要です。これを行うメソッドを見つけましたがXMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier)、パーサーがこのメソッドをどのように使用するかを見つけることができないため、それをオーバーライドして適切に行う方法がわかりません。XMLInputStramXMLInputSourceのドキュメントによると、「エンティティの解決と入力ストリームのオープンを呼び出し元に任せる」ため、Streamに.xsdファイルを含むものを返すと思いました。

だから私の質問は - データベースに保存された .xsd ファイルで catalog.xml からエンティティをマップする方法は?

問題を明確に説明したことを本当に願っていますが、私の英語が本当に下手であることはわかっています.

ごきげんよう、ジーシア

4

2 に答える 2

1

これは、用に作成したリゾルバーです。このリゾルバーは、システム ID を Maven アーティファクトのリソースに解決します。これは、あなたのタスクと多少似ています。

  • あなたの仕事は、基本的に、resolveEntityメソッドを実装することです。
  • 通常、既存の を拡張することが実用的CatalogResolverです。
  • その後、メソッドをオーバーライドできますgetResolvedEntity
  • 通常、最初に super メソッドを呼び出してsystemId/を解決しますpublicId
  • 次に、カスタム解像度を実行しようとします。
  • systemId通常、リソースの場所の URL (または論理 URI) です。
  • publicId多くの場合、名前空間 URI です。

クラスパスで解決される別のリゾルバーからの簡単なコード スニペットを次に示します。classpath:com/acme/foo/schema.xsd

public static final String URI_SCHEME_CLASSPATH = "classpath";

@Override
public String getResolvedEntity(String publicId, String systemId) {
    final String result = super.getResolvedEntity(publicId, systemId);

    if (result == null) {
        return null;
    }

    try {
        final URI uri = new URI(result);
        if (URI_SCHEME_CLASSPATH.equals(uri.getScheme())) {
            final String schemeSpecificPart = uri.getSchemeSpecificPart();
            final URL resource = Thread.currentThread()
                    .getContextClassLoader()
                    .getResource(schemeSpecificPart);
            if (resource == null) {
                return null;
            } else {
                return resource.toString();
            }
        } else {
            return result;
        }
    } catch (URISyntaxException urisex) {
        return result;
    }
}

あなたのシナリオでは、次のことを行います。

  • のように URI スキーマを定義しますdatabase:schema:table:value:id:schema.xsd
  • そのような URI を解決できるカタログ リゾルバーを作成します。
  • 名前空間 URI または絶対スキーマの場所の URL を URI に書き換えるカタログ ファイルを定義しますdatabase:...

簡単な表記法では、これは次のようになります。

REWRITE_SYSTEM "http://example.com/schemas" "database:schemas:content:schema_id:example/schemas"
  • したがって、「ベース」カタログ リゾルバーは最初http://example.com/schemas/schema.xsddatabase:schemas:content:schema_id:example/schemas/schema.xsd.
  • その後、コードはdatabase:schemas:content:schema_id:example/schemas/schema.xsdデータベース リソースに解決されます。
于 2014-10-29T09:55:10.510 に答える
0

わかりました、解決策を見つけました - 私が思ったように、メソッドは、指定された xsd スキーマを含む独自の InputStream を設定して XMLInputSource を返す必要がありますXMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier) このオーバーライドされたクラスの私のバージョン:

public XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier)
        throws XNIException, IOException {

    String resolvedId = resolveIdentifier(resourceIdentifier);

    if (resolvedId != null) {
        XMLInputSource xmlis = new XMLInputSource(resourceIdentifier.getPublicId(),
                resolvedId,
                resourceIdentifier.getBaseSystemId());

        try {
            InputStream is = getXSDFromDb(resourceIdentifier.getLiteralSystemId());                
            xmlis.setByteStream(is);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }

        return xmlis;
    }
    return null;
于 2014-10-30T12:35:40.727 に答える