- PR -

DBデータをプロパティ.xmlに格納

投稿者投稿内容
ttsk
会議室デビュー日: 2005/04/08
投稿数: 14
投稿日時: 2005-04-14 14:17
ttskと申します。
お世話になります。

別スレでいただいた情報をもとに
"http://www5.airnet.ne.jp/sakuraba/java/laboratory/J2SE1.5/TinyTips/Properties/Properties.html"
"http://www.hellohiro.com/property.htm"を参考にさせてもらい
MyProperties.xmlを読み込んで、MysSQL:test.hogeテーブルにアクセスして
値を出力するコードにしてみました。

try {
Properties prop = new Properties();
   InputStream stream = new FileInputStream("MyProperties.xml");
prop.loadFromXML(stream);
String driver = prop.getProperty("myprop.jdbc.driver");
String url = prop.getProperty("myprop.jdbc.url");
String user = prop.getProperty("myprop.jdbc.user");
String password = prop.getProperty("myprop.jdbc.password");
stream.close();

Class.forName(driver);
Connection con = DriverManager.getConnection(url,user,password);
Statement stmt = con.createStatement();
String sql = "SELECT * FROM hogetable";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
String mono = rs.getString("mono");
String bango = rs.getString("bango");
System.out.println(mono + " " + bango);
}
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();

このコードでDBのデータ(mono,bango)を出力する部分をproperties.xml様式 ( <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> )のxmlに格納したいのですが、
可能でしょうか。


[ メッセージ編集済み 編集者: ttsk 編集日時 2005-04-14 14:19 ]
ttsk
会議室デビュー日: 2005/04/08
投稿数: 14
投稿日時: 2005-04-14 17:10
自己レスです。

試してませんが,
 
System.out.println("<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>";
System.out.println("<!DOCTYPE properties SYSTEM \"http://java.sun.com/dtd/properties.dtd\">");
System.out.println("<entry key=\"" + mono + "\">" + bango + "</entry>");
........

こんな感じで書き出していくしかないでしょうか?
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-04-14 17:28
単純に、Propertiesのインスタンスを生成して、DBのデータをputし、
Properties#storeToXML()でファイル出力してやればよさそうな気がします。

コード:

Properties props = new Properties();
props.put(mono, bango);
FileOutputStream out = new FileOutputStream("hoge.xml");
props.storeToXML(out, "ほげ");
out.flush();
out.close();



[編集]
ちなみに。。。ですが、ttskさん提示のコードでは、標準出力にXML形式の
出力がされるだけで、ファイルには出ませんよ。
(標準出力をファイルにリダイレクトしていれば別ですが...)

あと、私が書いた上記コードはあくまで即興のサンプルで、このままでは
実用に耐えませんのであしからず。。。(ストリームのクローズはfinally句でする、等)
[/編集]


[ メッセージ編集済み 編集者: YOU@IT 編集日時 2005-04-14 17:37 ]
ttsk
会議室デビュー日: 2005/04/08
投稿数: 14
投稿日時: 2005-04-14 18:46
ご回答ありがとうございます。

さっそく,提示されたコードを一部コメントアウトして
--始め
Properties props = new Properties();
props.put(mono, bango);
FileOutputStream out = new FileOutputStream("hoge.xml");
props.storeToXML(out, "ほげ");
//out.flush(); 
//out.close();
--終わり
以上を
while(rs.next())句の中にいれてみましたが、出力された hoge.xml には
最後のレコードの値だけ入っていました。
どこでfor句を使うか見当がつきません。

--出力:hoge.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>ほげ</comment>
<entry key="最後のmono">最後のbango</entry>
</properties>

>>>ちなみに。。。ですが、ttskさん提示のコードでは、標準出力にXML形式の
>>>出力がされるだけで、ファイルには出ませんよ。
>>>(標準出力をファイルにリダイレクトしていれば別ですが...)

> hoge.xml にリダイレクトするつもりでした。
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-04-14 18:54
引用:

ttskさんの書き込み (2005-04-14 18:46) より:
while(rs.next())句の中にいれてみましたが、出力された hoge.xml には
最後のレコードの値だけ入っていました。
どこでfor句を使うか見当がつきません。


for文というか、Propertiesの特性(より正確には、Mapの特性)だと思います。

もし、Propertiesのキーになるmonoの値が常に同じなのであれば
値がどんどん上書きされるだけですので、最後のデータのみ出力される
ことになりますよね。

monoの値がデータによって異なるのであれば、ループ処理がおかしいのだと思います。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-04-14 19:10
引用:

ttskさんの書き込み (2005-04-14 18:46) より:

--始め
Properties props = new Properties();
props.put(mono, bango);
FileOutputStream out = new FileOutputStream("hoge.xml");
props.storeToXML(out, "ほげ");
//out.flush(); 
//out.close();
--終わり
以上を
while(rs.next())句の中にいれてみましたが、


FileOutputStreamのインスタンス化もループの中ですか?

#以下編集追加
String引数だけのFileOutputStreamをインスタンス化しても
追加書き込みされました。(Java1.5では)
(FileOutputStreamを何度もインスタンス化するのは良いとは思いませんが)
ただ、プロパティの値が一緒だと1行しか出なかったので、そこに原因があるのでは?


[ メッセージ編集済み 編集者: 夏椰 編集日時 2005-04-14 19:28 ]
ttsk
会議室デビュー日: 2005/04/08
投稿数: 14
投稿日時: 2005-04-14 21:44
YOU@IT様より引用: -------------------------------------------------
monoの値がデータによって異なるのであれば、ループ処理がおかしいのだと思います。

--------------------------------------------------------------------------------
いえ、最後のデータだけですので、上書きされているのだとおもいます。

夏椰様より引用: --------------------------------------------------------
FileOutputStreamのインスタンス化もループの中ですか?

String引数だけのFileOutputStreamをインスタンス化しても
追加書き込みされました。(Java1.5では)

ただ、プロパティの値が一緒だと1行しか出なかったので、そこに原因?
      --------------------------------------------------------------------------------
はい、"FileOutputStream out = new FileOutputStream("hoge.xml");" をループの中にいれています。

私の希望する出力ファイル形が以下のようなxmlなので追加上書きが無理なのかもしれないと、
思いはじめています。
<properties>
<comment>Temporary Properties</comment>
<entry key="子">2000</entry>
<entry key="牛">2001</entry>
<entry key="寅">2002</entry>
<entry key="卯">2003</entry>
..........
</properties>

いちど、key=value 平テキストのpropertiesファイルにして試してみます。
結果でましたら報告します。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-04-15 10:07
引用:

ttskさんの書き込み (2005-04-14 21:44) より:
はい、"FileOutputStream out = new FileOutputStream("hoge.xml");" をループの中にいれています。

私の希望する出力ファイル形が以下のようなxmlなので追加上書きが無理なのかもしれないと、
思いはじめています。
<properties>
<comment>Temporary Properties</comment>
<entry key="子">2000</entry>
<entry key="牛">2001</entry>
<entry key="寅">2002</entry>
<entry key="卯">2003</entry>
..........
</properties>

いちど、key=value 平テキストのpropertiesファイルにして試してみます。
結果でましたら報告します。



ループ処理の中に入れるものはProperties.putだけでした。
コード:

import java.io.* ;
import java.util.* ;

public class test {
public static void main(String[] args) {
File file = null ;
FileOutputStream out = null ;

String[] val = {"2000","2001","2002","2003" } ;
String[] key = {"A","B","C","D"} ;

try {
out = new FileOutputStream(file,true);

for ( int i = 0 ; i < val.length ; i++) {
props.put(val[i], key[i]);
}
props.storeToXML(out, "Temporary Properties");

}catch(Exception ex) {
ex.printStackTrace() ;
}
}
}


を実行すると
コード:

<properties>
<entry key="2000">A</entry>
<entry key="2001">B</entry>
<entry key="2002">C</entry>
<entry key="2003">D</entry>


と出力されました。
ただ、やはり値( 上記例でいうと2000とか2001)の重複は許されなかったです。

追加上書きをするっていうのはまだ実験していないのですが、
感じ的にファイルを読み込んで、値をPropertiesに保持し、
追加のデータをputしてファイルに新規書き込みする
って感じじゃ駄目ですかね?

#YOU@IT様のご指摘をうけ、出力結果を修正(04/15 11:35)

[ メッセージ編集済み 編集者: 夏椰 編集日時 2005-04-15 11:31 ]

スキルアップ/キャリアアップ(JOB@IT)