金子邦彦研究室プログラミングXML ドキュメントのリレーショナルデータベースへのマッピング(SQL, Java プログラムなど)XMLドキュメントとリレーショナルデータベースのマッピング

XMLドキュメントとリレーショナルデータベースのマッピング

JAXB と Ant を使い,XMLドキュメントのDTDファイルから,Java のクラスを自動生成することを行う.

マッピングを行うクラス

評価投稿マッピング.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」の動作チェックのためのクラス.以下の順序で実行が行われる

  1. sample1.xmlから評価投稿オブジェクト(自動生成されたクラス)へ格納   (JAXBによるアンマーシャリング)
  2. 評価投稿オブジェクトから各Dsoのオブジェクトへのデータの受け渡し   (評価投稿マッピング.setファイルDso 等を実行)
  3. Dsoオブジェクトの編集(今回は名前の変更)
  4. Dsoのオブジェクトから評価投稿オブジェクトへのデータの受け渡し   (評価投稿マッピング.set評価投稿 を実行)
  5. データを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();
        }
    }

}

実行手順