Powered by SmartDoc

データの読み込みと出力

出力コードについて

出力されたクラスをどう利用したら良いのか知るために、Relaxerの生成したコードを簡単に確認してみます。

まず、先程作成したRELAXスキームが読むデータをもう一度引用すると、リスト[XMLデータ再び]のようでした。

XMLデータ再び
<?xml version="1.0" encoding="Shift_JIS"?>
<dataList>
  <dataItem>
    <name>コーヒー</name>
    <cost>120</cost>
    <note>主食</note>
  </dataItem>
  <dataItem>
    <name>チョコレート</name>
    <cost>180</cost>
    <note>オヤツ</note>
  </dataItem>
  <dataItem>
    <name>ノート</name>
    <cost>150</cost>
    <note>いつでもどこでもアイデアを記録</note>
  </dataItem>
</dataList>

これを見れば、このようなデータを管理するには図[データ管理クラスの設計例]のようになるだろうと誰でも思い付くと思います。

データ管理クラスの設計例

そこで、生成されたソースRDataList.javaDataItem.java (節[付録:生成されたコード]を参照)を見てみると、なんと実際にその通りに生成されています。つまり、Relaxerは人間の思考に近い自然なクラス生成を行ってくれるすごいソフトウエアなのです。ある程度限界もあるようですが、入力するRELAXスキームの設計が良ければ、とてもすっきりしたコードを生成してくれます。

各属性へのアクセッサメソッドもRelaxerならきちんと全てつけてくれますし、データ構築のコンストラクタもいろいろな種類のものが用意されています。

実際に利用してみる

それでは、実際に入出力のコードを書いてみます。

Relaxerのコード自動生成により、リスト[ファイルから入力]のように、ファイルを読んで表示するだけの、非常にシンプルなプログラムになりました。ちなみに、このコードはDTDを使わないWell-formed形式のXMLデータ用です。

ファイルから入力
import java.io.File;

public class ReadByRelaxer {

    // 注:エラー処理は全くやってません

    public static void main(String[] args) throws Exception {
	//データを読んで
	RDataItem [] items = getDataItems("data.xml");
	//表示
	for (int i=0;i<items.length;i++) {
	    System.out.println("Name["+items[i].getName()+"]");
	    System.out.println("Cost["+items[i].getCost()+"]");
	    System.out.println("Note["+items[i].getNote()+"]");
	    System.out.println("--------");
	}
    }

    // filename -> DataItem配列
    static RDataItem [] getDataItems(String filename) throws Exception {
	RDataList list = new RDataList();
	list.setup(UJAXP.getDocument(new File(filename)));
	return list.getDataItem();
    }
    
}

データとしてリスト[XMLデータ]を使った時の実行結果は図[読み込み実行結果]のようです。

読み込み実行結果
% java ReadByRelaxer

Name[コーヒー]
Cost[120]
Note[主食]
--------
Name[チョコレート]
Cost[180]
Note[オヤツ]
--------
Name[ノート]
Cost[150]
Note[いつでもどこでもアイデアを記録]
--------

次に、内部のデータをXMLとして書き込む場合をリスト[ファイルへ書き込み]に示します。これも非常に単純で、オブジェクト直列化とほぼ同じ手順で書き込むことができます。

ファイルへ書き込み
import java.io.*;
import java.math.BigInteger;

public class WriteByRelaxer {

    // 注:エラー処理は全くやってません

    public static void main(String[] args) throws Exception {
	//データを読んで
	RDataList list = makeDataList();
	RDataItem [] items = list.getDataItem();
	//表示
	for (int i=0;i<items.length;i++) {
	    System.out.println("Name["+items[i].getName()+"]");
	    System.out.println("Cost["+items[i].getCost()+"]");
	    System.out.println("Note["+items[i].getNote()+"]");
	    System.out.println("--------");
	}
	//書き込み!
	writeData(list);
    }

    //書き込み部分
    static void writeData(RDataList list) throws Exception {
	PrintWriter out = new PrintWriter
	    (new OutputStreamWriter
		(new FileOutputStream( "output.xml" ),"Shift_JIS"));
	out.println(list.makeTextDocument());// 実質、保存はこの一行のみ
	out.flush();
	out.close();
    }

    // サンプルデータの作成
    static RDataList makeDataList() {
	RDataItem item1 = new RDataItem();
	item1.setName("携帯電話");
	item1.setCost(new BigInteger("40000"));
	item1.setNote("どこでも呼び出し");
	RDataItem item2 = new RDataItem();
	item2.setName("B5ノート");
	item2.setCost(new BigInteger("200000"));
	item2.setNote("どこでもお仕事");
	//
	RDataList list = new RDataList();
	list.addDataItem(item1);
	list.addDataItem(item2);
	return list;
    }

}

この実行結果は図[書き込み実行結果]のようです。

書き込み実行結果
% java WriteByRelaxer

Name[携帯電話]
Cost[40000]
Note[どこでも呼び出し]
--------
Name[B5ノート]
Cost[200000]
Note[どこでもお仕事]
--------

さらに、書き込まれたファイルはリスト[output.xml]のようになりました。

output.xml
<dataList><dataItem><name>携帯電話</name><cost>40000</cost><note>どこでも呼び出し</note></dataItem><dataItem><name>B5ノート</name><cost>200000</cost><note>どこでもお仕事</note></dataItem></dataList>