質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.63%

XMLからテキストの生成

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 883
退会済みユーザー

退会済みユーザー

XMLからテキストの生成の過程に登場するStringWriterオブジェクトの意味合いについて質問です。
ソースコードは次のようなものです。

TransformerFactory tfactory = TransformerFactory.newInstance();
            StringWriter writer = new StringWriter();
            StreamResult stream = new StreamResult(writer);
            Transformer trans = tfactory.newTransformer();
            trans.transform(new
                DOMSource(doc.getDocumentElement()), stream);
            str = stream.getWriter().toString();


上のコードにおいて、StringWriterはなぜ必要なのでしょうか?
Transformerが必要なのはわかりますし、そのためにそのFactoryが必要になるのもわかります。
そして、マークアップ言語を保持するためのホルダーであるStreamResultも必要なのはわかります。
StreamResultオブジェクトを形成するために必要、というのがコードからの答えになるでしょうが、その意味合いを教えていただけなのでしょうか?
回答お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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は写像した結果の文字列を流し込む先という意味になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/08 11:06

    大方理解できたと思います。
    ちょっと変な質問かもしれませんが、ストリームというと、上流と下流に何があるのか既に決まっているものと考えていたのですが、この場合ですと、上流(データの流れる元)はStreamResultになりますが、下流(データの送信先)はまだ決まっておらず、自由に決めることができるのですか?

    キャンセル

  • 2016/11/08 11:49

    そのとおりです。StreamResult自体は具体的な出力先(文字バッファーとかファイルとか)を直接規定しません。それはStreamResultに与えるWriter/OutputStreamのインスタンスが決めることになるので、billさんが想像されているとおりプログラマーが自由に決めることができます。

    キャンセル

  • 2016/11/09 21:33

    回答ありがとうございました。

    キャンセル

0

StreamResultクラスのコンストラクタは複数種類ありますので都合の良いものを選ぶのが良いですが、StringWriterであればバッファつき文字列の文字ストリームなので、XMLを扱うには一番適しているのではないでしょうか。

というのも、XMLはバイナリデータではなく、テキストデータですので。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/07 09:29

    すみません、よくわかりませんでした。
    StreamResultもバッファになるのでしょうか?
    コンストラクタの引数にStringWriterを指定した場合、イメージ的には、バッファにマークアップ言語を保持する、といった状態になるのでしょうか?

    キャンセル

  • 2016/11/07 12:18

    「StreamResultがバッファになる」がよくわかりませんが、テキストファイルを読み込む際にバッファを使って読み込んでくれるようになります。
    あと、「マークアップ言語を保持する」と書くと語弊があるかと。

    キャンセル

  • 2016/11/09 21:33

    回答ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる