XOMを使用して、膨大な数の検索結果をXMLとしてPrintWriterまたはOutputStreamに出力したいとします。結果のXMLは次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<resultset>
<result>
[child elements and data]
</result>
...
...
[1000s of result elements more]
</resultset>
結果のXMLドキュメントは大きくなる可能性があるため(おそらく数百メガバイト)、(ドキュメント全体をメモリに作成してから書き込むのではなく)ストリーミング形式で出力したいと思います。
一度に1つずつ出力する粒度は良いので、次々<result>
に生成してストリームに書き込みたいと思います。<result>
言い換えれば、私は単にこの擬似コードのようなことをしたいのです(自動フラッシュが有効になっているので、それについて心配しないでください):
open stream/writer
write declaration
write start tag for <resultset>
while more results:
write next <result> element
write end tag for <resultset>
close stream/writer
私は見てきましたSerializer
が、必要なメソッド、、、writeStartTag(Element)
は保護されており、公開されていませんwriteEndTag(Element)
!write(DocType)
これらのメソッドを使用できるようにSerializerをサブクラス化する方法、またはXOMを完全にバイパスして開始タグと終了タグを文字列としてストリームに直接手動で書き込む以外に方法はありませんか?(後者はこの単純な例ではそれほど悪くはありませんが、一般的な場合はかなり醜くなります。)
私は何かが足りないのですか、それともXOMはこれのために作られていないのですか?
dom4jを使用すると、これを簡単に使用できます。これには、または、メソッド、などXMLWriter
を受け取るコンストラクターがあります。パブリックメソッドが全体を受け取る唯一のメソッドであるXOMと比較してください。Writer
OutputStream
writeOpen(Element)
writeClose(Element)
writeDocType(DocumentType)
Serializer
write
Document
(これは、XOMが強力な候補である場合の最良のdom4j置換に関する私の質問に関連しています。)