質問: stream.getWriter().toString(); ``` 上のコードにおいて、StringWriterはなぜ必要なのでしょうか? Transformerが必要なのはわかりますし、そのためにそのFactoryが必要になるのもわかります。 そして、マークアップ言語を保持するためのホルダーであるStreamResultも必要なのはわかります。 StreamResultオブジェクトを形成するために必要、というのがコードからの答えになるでしょうが、その意味合いを教えていただけなのでしょうか? 回答お願いします。
回答: XMLはご存知の通り様々なアプリケーション間で情報をやりとりする目的で用いるためのデータの表現形式です。この目的のため、XMLデータはXML形式そのままのテキスト、DOM、Javaオブジェクトなど色々なものとして解釈することができるように意図されたものですが、Java上でこれら様々なものへの写像を表す役割を持っているのがTransformerクラスです。 リファレンスを見るとTransformerクラスにはただ一つのtransformメソッドしかありません。写像先の形式がどのようなものなのかはtransformの第二引数であるResultによって決まるように設計されています。 さらにリファレンスを見るとResultを実装したクラスには写像先がストリームであることを表すStreamResultだけではなく、DOMを表すDOMResult、Javaオブジェクトを表すJAXBResult等々が用意されていることがわかります。ResultはXMLデータの「入れ物」と考えてもよいのですが、Transformerからみると単にXMLデータの要素などを流し込む先(データシンク)として設計されています。それぞれのResultクラスの都合に応じて流し込まれたデータは特定の形式で蓄積したり、別のデータシンクへパスしたりと様々な振る舞いをするようになっています。 さてStreamResultはXMLデータを文字の列へ変換することを表すデータシンクとして設計されています。さらに結果は文字列バッファへ蓄積するような固定的な方法ではなく、文字列を得たりファイルへ出力したり通信先へ送信したりといった様々な目的を統一的に効率よく扱えるよう「出力ストリーム(Writer or OutputStream)を用いる」ように設計されています。 そんなわけでStreamResultにあるWriterもしくはOutputStreamは写像した結果の文字列を流し込む先という意味になります。