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

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

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

2300閲覧

XMLからテキストの生成

退会済みユーザー

退会済みユーザー

総合スコア0

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/11/06 14:09

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

Java

1TransformerFactory tfactory = TransformerFactory.newInstance(); 2 StringWriter writer = new StringWriter(); 3 StreamResult stream = new StreamResult(writer); 4 Transformer trans = tfactory.newTransformer(); 5 trans.transform(new 6 DOMSource(doc.getDocumentElement()), stream); 7 str = stream.getWriter().toString();

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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/07 04:21

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/08 02:06

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

2016/11/08 02:49

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

退会済みユーザー

2016/11/09 12:33

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

0

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

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

投稿2016/11/06 23:43

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/07 00:29

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

2016/11/07 03:18

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

退会済みユーザー

2016/11/09 12:33

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問