出力されたクラスをどう利用したら良いのか知るために、Relaxerの生成したコードを簡単に確認してみます。
まず、先程作成したRELAXスキームが読むデータをもう一度引用すると、リスト[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.javaとDataItem.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]のようになりました。
<dataList><dataItem><name>携帯電話</name><cost>40000</cost><note>どこでも呼び出し</note></dataItem><dataItem><name>B5ノート</name><cost>200000</cost><note>どこでもお仕事</note></dataItem></dataList>