8

A と B の 2 つのプロジェクトがあるとします。重要な場合に備えて、Java プロジェクトです。

プロジェクト A には、コアの型と要素を表す一連の XSD ファイルが含まれています。それらはすべて、たとえば「定義」と呼ばれるパッケージに配置されます。これは に組み込まれproject-a.jarます。

プロジェクト B は拡張プロジェクトを表し、独自の型と要素を定義できます。新しいスキーマを作成し、「definition.extension」パッケージに配置しました。これは に組み込まれproject-b.jarます。

さて、プロジェクト B の XSD の場合、正確には何を として入力する必要schemaLocationがありincludeますか?

schemaLocation="../core-types.xsd"うまくいきませんでした(URIが必要なのはわかっています)が、これに対する適切なまたは標準的なアプローチは正確には何ですか?Google は、これを処理するための実際の正しい方法は何かについて、明確で標準的なアプローチであるというこの質問をする人が増えていることを発見しました。

実行時にプログラムで調整したことはあり得ません...または、コンパイル中にschemaLocation動的に置き換えるビルドステップ/スクリプトが必要になることはありません...そうですか?schemaLocation

「共有の場所に置く」などの答えは探していません。ハードコードされた参照の代わりに相対参照を使用する開発環境に沿ったものを探しています。

参考までに、IDE 固有のアプローチがある場合に備えて、IntelliJ IDEA を使用しています。

4

2 に答える 2

1

IntelliJ がインクルードを赤で表示するのを止めたい場合は、インクルードでカスタム URI を使用できます。次に、プロジェクト設定 -> スキーマと DTD に移動し、この URI をローカル ファイルにマップできます。

実行時にスキーマの検証を行う必要がある場合は、話は別です。おそらく XML カタログを使用する必要があります。JAXB を使用している場合は、この質問を確認する必要があります: jaxb - how to map xsd files to URL to find them

于 2013-03-26T13:47:50.580 に答える
0

XML カタログを使用する必要があります。このリンクでは、XML の専門家である Norman Walsh による XML カタログの完全な紹介と、たとえば Java での使用方法について説明しています。見積もり:

これらのカタログ ファイルを使用して、パブリック識別子とシステム識別子、およびその他の URI をローカル ファイル (または単にその他の URI) にマップできます。

前述の識別子は通常、スキーマで使用するschemalocationまたはです。namespaceimport

このようなカタログを使用する場合、混乱やXJC のバグを避けるためにschemaLocation、XML スキーマのスキーマ インポートからすべてのを削除し、 namespace(もちろん選択肢がある場合)のみを保持することを強くお勧めします。例えば:

<import namespace="http://www.w3.org/1999/xlink" />

次に、カタログ内の実際のスキーマの場所への各名前空間のマッピングを指定します。たとえば、OASIS XML カタログ形式を使用すると、次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
    <uri name="http://www.w3.org/1999/xlink" uri="w3c/1999/xlink.xsd" />
</catalog>

コンパイル時に、スキーマから JAXB アノテーション付きクラスを生成する場合は、エピソードを使用して個別のスキーマ コンパイル(モジュラー スキーマ コンパイル) を実現することをお勧めします。これは、たとえばmaven-jaxb2-pluginによってサポートされており、カタログの高度なサポートも備えています。

ランタイムについては、XML のユース ケースに応じて、Web を開発している場合は、ほとんどの Java Web サービス フレームワーク (JAX-WS RI/Metro、Apache CXF...) など、XML カタログをネイティブにサポートするライブラリを使用するようにしてください。たとえばサービス。XML カタログを制御できない場合、または XML カタログをより細かく制御したい場合 (たとえば、クラスパスからスキーマをロードできるようにする場合) は、前述のXML エンティティと URI リゾルバーのページ、特に人気のあるカタログを使用するセクションを参照することをお勧めします。アプリケーションおよび アプリケーションへのカタログ サポートの追加。基本的に、必要org.apache.xml.resolver.tools.CatalogResolverに応じて (より細かく制御するために)org.apache.xml.resolver.CatalogManagerクラスを使用します。CatalogResolverカスタム/の具体的な例についてはCatalogManager、Apache のコード ソースを参照してください。commons-configurationAuthzForceCXFなど。

于 2016-11-23T12:17:47.727 に答える