2

XML ストリームを変更するために、StAX イベント ベースの API を使用しています。ストリームは、DTD 宣言を備えた HTML ドキュメントを表します。この DTD 宣言を出力ドキュメント ( を使用して記述) にコピーしたいと考えていますXMLEventWriter。ファクトリに DTD を無視するように依頼すると、DTD はダウンロードされず、ステートメント全体が削除され、" <!DOCUMENTTYPE" 文字列だけが残ります。無視しない場合、DTD 全体がダウンロードされ、DTD イベントを逐語的に出力するときに含まれます。この DTD をダウンロードするのに時間をかけたくありませんが、完全な DTD 仕様を含めます (エンティティの解決は既に無効になっており、必要ありません)。外部DTDのフェッチを無効にする方法を知っている人はいますか?

4

2 に答える 2

4

外部 DTD を取得しようとする試みをローカル リソースにリダイレクトするカスタム XMLResolver を実装できるはずです (コードが特定のドキュメント タイプのみを解析する場合、これは多くの場合、JAR 内のクラス リソースです)。

class CustomResolver implements javax.xml.stream.XMLResolver {

  public Object resolveEntity(String publicID,
                              String systemID,
                              String baseURI,
                              String namespace)
                  throws XMLStreamException 
  {
    if ("The public ID you expect".equals(publicID)) {
      return getClass().getResourceAsStream("doc.dtd");
    } else {
      return null;
    }
  }

一部のドキュメントには「systemID」のみが含まれていることに注意してください。そのため、チェックに戻る必要があります。システム識別子の問題は、よく知られている安定した URI ではなく、「システム」固有の URL であると想定されていることです。実際には、URI であるかのように使用されることがよくあります。

setXMLResolverメソッドを参照してください。

于 2008-11-21T18:04:03.237 に答える
1

また、これまで JDK 1.6 にバンドルされているデフォルトの Sun stax パーサーを使用していた場合、元のアプローチ (SUPPORT_DTD を false に設定) は Woodstox でも機能する可能性があります。

于 2009-01-27T20:42:18.613 に答える