1

次の DOCTYPE を使用して DTD を定義する xml ファイル ('videofaq.xml') があります。

<!DOCTYPE video-faq SYSTEM "videofaq.dtd">

次を使用して、サーブレットの初期化時にクラスパスから(実際にはJARから)ファイルをロードしています。

getClass().getResourceAsStream("videofaq.xml")

XML は正しく検出されましたが、同じパッケージ内の DTD の場合、Xerces は FileNotFoundException を返し、最後に「videofaq.dtd」が追加された Tomcat 起動スクリプトへのパスを表示します。Xerces に DTD を適切にロードさせるために、どのようなヒントを渡すことができますか?

4

4 に答える 4

1

あなたがするとき

getClass().getResourceAsStream("videofaq.xml")

呼び出しているのは xerces ではないため、ストリームを xerces に渡すと、ファイルがどこからロードされたのかわかりません。アプリケーションのルートパス(説明済み)からロードします。

簡単な解決策は、xml ファイルで dtd へのパス全体を指定することです。

また、xerces は複数の場所を試すようです。したがって、文法キャッシング機構またはエンティティリゾルバー (この順序で使用されていると思います) を確認する必要があります。

Xerces 文法ドキュメント: http://xerces.apache.org/xerces2-j/faq-grammars.html

Xerces 機能 use-entity-resolver2: http://xerces.apache.org/xerces2-j/features.html

于 2008-11-26T16:02:51.823 に答える
1

カスタム EntityResolver は機能しますが、プロセッサが相対パスを「検索」できるように SystemID を設定することで、カスタム クラスを作成する必要がなくなる場合があります。

http://www.onjava.com/pub/a/onjava/excerpt/java_xslt_ch5/index.html?page=5

システム識別子をパラメータとして StreamSource に提供することで、XSLT プロセッサに c​​ommonFooter.xslt を探す場所を伝えます。このパラメータがないと、プロセッサがこの URI を解決できないときにエラーが発生する可能性があります。簡単な修正は、次のように setSystemId( ) メソッドを呼び出すことです。

// construct a Source that reads from an InputStream
Source mySrc = new StreamSource(anInputStream);
// specify a system ID (a String) so the 
// Source can resolve relative URLs
// that are encountered in XSLT stylesheets
mySrc.setSystemId(aSystemId);
于 2008-11-28T14:11:13.363 に答える
0

SAX を使用する場合は、独自のものを提供してEntityResolver、任意の方法でリソースをロードできます。

于 2008-11-26T16:04:07.767 に答える
0

一般に、XML パーサーの入力を指定するときは、URL (通常は「systemId」などのパラメーター名を持つ文字列) を受け取るメソッド オーバーロードを使用するようにしてください。これにより、パーサーが相対参照を解決し、より適切なエラー メッセージを提供できるようになります。

したがって、あなたの場合、videofaq.xml と同じパッケージで DTD を見つけ、そのString結果をgetClass().getResource("videofaq.xml")XML パーサーに渡します。

于 2008-11-26T16:19:03.633 に答える