---
1: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2: DocumentBuilder builder = factory.newDocumentBuilder();
3: Document = builder.parse(in);
---
テストのため3のところでパースする文書をファイルから読むのではなくソースコー
ドに埋めたいので、javax.xml.parsers.DocumentBuilderクラスのparse(InputStream
is) を使用することとして、InputStreamのサブクラスである
java.io.StringBufferInputStreamが使えると思ったのですが、APIを調べると「非推
奨」となっていました。
ソースコードに書き込んだStringからDOMを生成するにはどのようにすればよいで
しょうか(StringからInputStreamを取得する方法)?
---
かずほ
西野さん> そういう時のためにjavax.xml.transform.stream.StreamSourceが
西野さん> あるのです。
java.io.ByteArrayInputStreamの方が簡単では?
InputStream in;
String xmlDoc = "<?xml version=\"1.0\"?> \n" +
........................................................................;
in = new ByteArrayInputStream(xmlDoc.getBytes());
builder.parse(in);
言われてみれば私もニュースグループを見る/投稿するって、1年ぶりくらいなのです
が、よく見るとfj.comp.lang.javaも投稿数少ないですね。皆さんどちらに行かれた
のでしょう?
>java.io.ByteArrayInputStreamのほうがかなりコードが少なくて書けるので
なんと後ろ向きな・・・・。と言うより、何故、あんな使いにくいJAXPにこだわるのでしょうか、Java1.4からバンドルされているからでしょうか。僕ならJDOMを使いますね。因みに、JDOMのorg.jdom.input.SAXBuilderに以下のメソッドがあります。
Document build(java.io.Reader characterStream)
つまり、スピードの速いSAXで読んで、DOMオブジェクトに相当するDocumentを作るわけです。これをDOMに変換することも簡単だし、そんなことをわざわざしなくても、いろいろなことが出来ます。
また、JDOMと一緒にxerces、xalanもバンドルされています。
以上です。
>java.io.ByteArrayInputStreamのほうがかなりコードが少なくて書けるので
なんと後ろ向きな・・・・。と言うより、何故、あんな使いにくいJAXPにこだわるので
(グサッ…)
そ、そう、書かれると思いました…。
> と言うより、何故、あんな使いにくいJAXPにこだわるので
> しょうか、Java1.4からバンドルされているからでしょうか。
図星です。まずは標準でついているクラスライブラリで作ってみて、我慢できなけれ
ば他を探そうかと…SUNのクラスライブラリのやつは、ちょっとしたことをするにも
準備が大変で面倒くさいという印象でした。今度、JDOMとやらも試してみたいと思い
ます。
かずほ <kaz...@jp.org> writes:
僕も先日、ものすごく久しぶりに ネットニュースを使いました。
コンピュータ関係の本を売ろうと思ったのですが、まったく リアクションな
しでした。
周辺には、「ネットニュースなんて知らない」という人も けっこういるみた
いですし、このままさびれてしまうのかなぁ。
さびしいです。
※あまりにも久しぶりに GNUS 使うので、使い方間違えているかもしれませぬ。
粗相がありましてもご容赦ください。
遅まきながらJDOMを使い始めました。使いやすいです。
…が、ファイルに書き出そうとして、
---
Document doc = new Document(root);
XMLOutputter out = new XMLOutputter(" ", true, "UTF-8");
File f = new File("test.xml");
FileWriter writer = new FileWriter(f);
out.output(doc, writer);
---
としてencodingにUTF-8を指定しても<?xml version="1.0" encoding="UTF-8"?>とは
なるものの肝心の文字コードがUTF-8になっていないようです。java.io.FileWriter
がデフォルトエンコーディングで出力するせいでしょうか?
UTF-8など望みのコードで出力するにはどのようにすればよいでしょうか?
---
かずほ
ソースを確認すると、
XMLOutputter のコンストラクタでエンコーディング指定を渡しているのなら,
OutputStreamを渡すと、内部でWriterでくるんでくれるようです。
バッファのフラッシュのタイミングを気にしない(GCに任せる)のなら次の記述でOKです。
out.output(doc, new java.io.FileOutputStream(f));
>ソースを確認すると、
>XMLOutputter のコンストラクタでエンコーディング指定を渡しているのなら,
>OutputStreamを渡すと、内部でWriterでくるんでくれるようです。
>
>バッファのフラッシュのタイミングを気にしない(GCに任せる)のなら次の記述でOKです。
>
>out.output(doc, new java.io.FileOutputStream(f));
>
もちろん、仰るとおりなんですが、質問者のかずほさんが、writer系にこだわっているように見受けられましたし、writerを使う場合は、エンコードを明確にしなければならないことを示すために、最初streamだったのを撤回して、writerでのやり方をお見せした次第です。
以上です。
>ソースを確認すると、
>XMLOutputter のコンストラクタでエンコーディング指定を渡しているのなら,
>OutputStreamを渡すと、内部でWriterでくるんでくれるようです。
>
>バッファのフラッシュのタイミングを気にしない(GCに任せる)のなら次の記述でOKです。
>
>out.output(doc, new java.io.FileOutputStream(f));
>
もちろん、仰るとおりなんですが、
質問者のかずほさんが、writer系にこだわっているように見受けられましたし、
writerを使う場合は、エンコードを明確することがポイントであることを示す
ために、先にstreamの方を撤回して、writerの方をポストしたわけなんです。
念のため。
以上です。
以上です。
Iwao Watanabe <iw...@DSL.gr.jp>さんからも同じ方法を教えていただいた上記の記述
で、
XMLOutputter out = new XMLOutputter(" ", true, "UTF-8");
のエンコード指定部分で指定した文字コードで出力されていることが確認できまし
た。
> ではなくて、全部書くと、以下のとおりです。
> Document doc = new Document(root);
> XMLOutputter out = new XMLOutputter(" ", true, "UTF-8");
> File f = new File("test.xml");
> FileWriter writer = new FileWriter(OutputStreamWriter(FileOutputStream(f),
> "UTF-8"));
> out.output(doc, writer);
> です。
こちらのコード、writerへの代入文の中でそれぞれにnewでオブジェクトを作らなけ
ればならないのでしょうが、それはそれとしてJDKのjavadocをあちこち見て廻っても
良くわかりませんでした。OutputStreamWriterを引数に取るFileWriterのコンストラ
クタが無いようですし。
いずれにしても西野さんにご紹介していただいたおかげで、JDOM、とても気に入って
います。JAXPでの苦痛がウソのようです。なんだかXMLが身近に感じられるようにな
りました。ありがとうございます。
教えていただいたとおり、XMLOutputterでの指定したコードで出力されることを確認
しました。JDOMのソースを追っかけたわけではないので不思議な感じがしますが…
FileWriterを引数にしたときにはエンコードが反映されないってのは、上記と統一性
が無くて混乱しますね。1.0に期待?
確かに…ボールドで…
(偶然)同じエンコーディングでうまくいっていて、他のシステムに持っていったと
きにはたと気が付いたので、見落としてました。というか、コンストラクタの記述を
読んで思い込んでいたのがバレバレですね。申し訳ないです。