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