2011年6月16日木曜日

オブジェクトのXML保存

Webアプリケーションを開発しているとオブジェクトをデータベースに保存したくなる時があります。
オブジェクトをXML化してテキスト形式として保存しておけば楽ちんですね。

そこで、まずはXMLが取り扱えるようにすべくネットを検索してみるとDOM4Jがよさげです。
現在の開発環境を調べてみると、すでにDOM4Jが使えるようになっていました(^^;

ところがドキュメント、サンプルでめぼしい物が見当たりません。しかたが無いのでXMLの基礎知識をざっと読みあさってから、ドキュメントを参考にしながら簡単なXMLドキュメントを作成して見たのが次のソースです。

例:
「HogeBeanのコンストラクタ引数をXMLで保存しておいて、後でインスタンスを動的に生成する」という利用を想定してみました。

Document doc = DocumentHelper.createDocument();
 Element eleBoject = DocumentHelper.createElement(DocumentHelper.createQName("Object"));

 Element eleName = DocumentHelper.createElement(DocumentHelper.createQName("Name"));
 eleName.add(DocumentHelper.createText("HogeBean"));
 eleBoject.add(eleName); // Node 0

 Element arg0 = DocumentHelper.createElement(DocumentHelper.createQName("key"));
 arg0.addAttribute("index", "0");
 arg0.addAttribute("class", "jp.co.hoge.hoge0");
 arg0.add(DocumentHelper.createText("hikisuu0"));
 eleBoject.add(arg0); // Node 1

 Element arg1 = DocumentHelper.createElement(DocumentHelper.createQName("key"));
 arg1.addAttribute("index", "1");
 arg1.addAttribute("class", "jp.co.hoge.hoge1");
 arg1.add(DocumentHelper.createText("hikisuu1"));
 eleBoject.add(arg1); // Node 2

 doc.add(eleBoject);
 String text = doc.asXML();
 System.out.println(text);

あとは、文字列として保存しておくだけです。

次に、保存したテキストからドキュメントオブジェクトに変換については

Document doc = DocumentHelper.parseText(テキスト);

で、簡単にドキュメントオブジェクトに変換できます。
あとは、このドキュメントから情報を取り出すだけですが、そのサンプルが以下のソースになります。

Element o = doc.getRootElement();
  if(o.getQName().getName().equals("Object")){
   for(int j = 0; j < o.nodeCount(); j++){
    Node n = o.node(j);
    if(n.getNodeType() == Node.ELEMENT_NODE){
     Element e = (Element) n;
     if(e.getQName().getName().equals("Name")){
      System.out.println(e.getText());
     }else if(e.getQName().getName().equals("key")){
      for(int k = 0; k < e.attributeCount(); k++){
       Attribute a = e.attribute(k);
       System.out.println(a.getName()+ "=" + a.getText());
      }
     }else{
      // 必要に応じてNodeを判定して処理します。
     }
    }
   }
  }

保存されたクラス名とコンストラクタ引数が取得できたので、あとは動的にインスタンスを生成するだけですが、その方法は別途調べないといけません(^^;

0 件のコメント:

コメントを投稿