XMLドキュメントとリレーショナルデータベースのマッピング
JAXB と Ant を使い,XMLドキュメントのDTDファイルから,Java のクラスを自動生成することを行う.
マッピングを行うクラス
- XMLドキュメントからリレーショナルデータベースへのマッピングを行うメソッド
setファイルDso, set投稿者Dso, set作品評価Dso
- リレーショナルデータベースからXMLドキュメントへのマッピングを行うメソッド
set評価投稿
評価投稿マッピング.java を、以下のように作る
package hoge.hoge.com; import hoge.hoge.com.*; import javax.xml.bind.*; import java.io.*; import java.util.*; public class ConvertDsoSample { private static ファイルDso ファイルDso; private static 投稿者Dso 投稿者Dso; private static List<作品評価Dso> 作品評価Dsoリスト; private static 評価投稿 評価投稿; public static void input評価投稿(String ファイル名){ try { JAXBContext context = JAXBContext.newInstance("hoge.hoge.com"); Unmarshaller unmarshaller = context.createUnmarshaller(); 評価投稿 = (評価投稿)unmarshaller.unmarshal(new FileReader(ファイル名)); } catch (JAXBException e) { // TODO Auto-generated catch block System.err.println("JAXB Error"); e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block System.err.println("Not Found " + ファイル名); e.printStackTrace(); } } public static void output評価投稿(OutputStream out){ try { JAXBContext context = JAXBContext.newInstance("hoge.hoge.com"); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.setProperty(Marshaller.JAXB_ENCODING, "shift-jis"); // marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE); PrintWriter printWriter = new PrintWriter(out); printWriter.println(""); printWriter.println(""); printWriter.flush(); marshaller.marshal(評価投稿, out); } catch (JAXBException e) { // TODO Auto-generated catch block System.err.println("JAXB Error"); e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String readFile = "sample1.xml"; String writeFile = "sample3.xml"; // ファイルからの読み込み input評価投稿(readFile); System.out.println("読み込んだファイル : " + readFile); System.out.println("----------------------------------------------------------"); output評価投稿(System.out); System.out.println("----------------------------------------------------------"); // 各Dsoへの受け渡し ファイルDso = 評価投稿マッピング.setファイルDso(評価投稿, readFile); 投稿者Dso = 評価投稿マッピング.set投稿者Dso(評価投稿); 作品評価Dsoリスト = new ArrayList<作品評価Dso>(); Iterator<作品評価> iterator = 評価投稿.get作品評価リスト().get作品評価().iterator(); while(iterator.hasNext()){ 作品評価 作品評価 = iterator.next(); 作品評価Dsoリスト.add(評価投稿マッピング.set作品評価Dso(評価投稿, 作品評価)); } // 処理 投稿者Dso.set漢字姓("田中"); 投稿者Dso.setかな姓("たなか"); 投稿者Dso.set漢字名("一郎"); 投稿者Dso.setかな名("いちろう"); // 各Dsoからの受け渡し 評価投稿 = 評価投稿マッピング.set評価投稿(投稿者Dso, 作品評価Dsoリスト.iterator()); // コンソールへの出力 System.out.println(); System.out.println("出力内容 : " + writeFile); System.out.println("----------------------------------------------------------"); output評価投稿(System.out); System.out.println("----------------------------------------------------------"); // ファイルへの出力 try { output評価投稿(new FileOutputStream(writeFile)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block System.err.println("Cannot write " + writeFile); e.printStackTrace(); } } }
テスト用クラス
上記で作った「評価投稿マッピング.java」の動作チェックのためのクラス.以下の順序で実行が行われる
- sample1.xmlから評価投稿オブジェクト(自動生成されたクラス)へ格納 (JAXBによるアンマーシャリング)
- 評価投稿オブジェクトから各Dsoのオブジェクトへのデータの受け渡し (評価投稿マッピング.setファイルDso 等を実行)
- Dsoオブジェクトの編集(今回は名前の変更)
- Dsoのオブジェクトから評価投稿オブジェクトへのデータの受け渡し (評価投稿マッピング.set評価投稿 を実行)
- データをsapmle3.xmlのファイルとして出力 (JAXBによるマーシャリング)
「import hoge.hoge.com.*;」(1箇所) と 「JAXBContext context = JAXBContext.newInstance("hoge.hoge.com");」(2箇所)は,Ant でクラスを生成したときのパッケージ名と一致させてください.
package hoge.hoge.com; import hoge.hoge.com.*; import javax.xml.bind.*; import java.io.*; import java.util.*; public class ConvertDsoSample { private static ファイルDso ファイルDso; private static 投稿者Dso 投稿者Dso; private static List<作品評価Dso> 作品評価Dsoリスト; private static 評価投稿 評価投稿; public static void input評価投稿(String ファイル名){ try { JAXBContext context = JAXBContext.newInstance("hoge.hoge.com"); Unmarshaller unmarshaller = context.createUnmarshaller(); 評価投稿 = (評価投稿)unmarshaller.unmarshal(new FileReader(ファイル名)); } catch (JAXBException e) { // TODO Auto-generated catch block System.err.println("JAXB Error"); e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block System.err.println("Not Found " + ファイル名); e.printStackTrace(); } } public static void output評価投稿(OutputStream out){ try { JAXBContext context = JAXBContext.newInstance("jp.ac.kyushu_u.is.db.test"); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.setProperty(Marshaller.JAXB_ENCODING, "shift-jis"); marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE); PrintWriter printWriter = new PrintWriter(out); printWriter.println(""); printWriter.println(""); printWriter.flush(); marshaller.marshal(評価投稿, out); } catch (JAXBException e) { // TODO Auto-generated catch block System.err.println("JAXB Error"); e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String readFile = "sample1.xml"; String writeFile = "sample3.xml"; // ファイルからの読み込み input評価投稿(readFile); System.out.println("読み込んだファイル : " + readFile); System.out.println("----------------------------------------------------------"); output評価投稿(System.out); System.out.println("----------------------------------------------------------"); // 各Dsoへの受け渡し ファイルDso = ConvertDso.setファイルDso(評価投稿, readFile); 投稿者Dso = ConvertDso.set投稿者Dso(評価投稿); 作品評価Dsoリスト = new ArrayList<作品評価Dso>(); Iterator<作品評価> iterator = 評価投稿.get作品評価リスト().get作品評価().iterator(); while(iterator.hasNext()){ 作品評価 作品評価 = iterator.next(); 作品評価Dsoリスト.add(ConvertDso.set作品評価Dso(評価投稿, 作品評価)); } // 処理 投稿者Dso.set漢字姓("田中"); 投稿者Dso.setかな姓("たなか"); 投稿者Dso.set漢字名("一郎"); 投稿者Dso.setかな名("いちろう"); // 各Dsoからの受け渡し 評価投稿 = ConvertDso.set評価投稿(投稿者Dso, 作品評価Dsoリスト.iterator()); // コンソールへの出力 System.out.println(); System.out.println("出力内容 : " + writeFile); System.out.println("----------------------------------------------------------"); output評価投稿(System.out); System.out.println("----------------------------------------------------------"); // ファイルへの出力 try { output評価投稿(new FileOutputStream(writeFile)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block System.err.println("Cannot write " + writeFile); e.printStackTrace(); } } }
実行手順
- sample1.xml を、プロジェクトにインポートしておく
- 実行し、できた sample3.xml を確認する