アキはフリーランスのプログラマーです >> Java
Sponsored link

このエントリーを含むはてなブックマーク このエントリーを含むECナビ人気ニュース

FreeMindのMapファイル(拡張子 .mm)をBetwixtを使って読み書きする!


FreeMindとはマインドマップを作るソフトです。

入手先等はこちらをどうぞ



FreeMindのファイルは拡張子 .mm のファイルです。

このファイル形式はXMLです。


 ここでは以下のようなFreeMindファイルを例にします。

<map version="0.7.1">
<node TEXT="Java">
<node TEXT="デスクトップ" POSITION="right">
<node TEXT="SWT"/>
<node TEXT="AWT"/>
<node TEXT="Swing"/>
</node>
<node TEXT="モバイル" POSITION="right">
<node TEXT="MID Profile"/>
<node TEXT="DoJa Profile"/>
</node>
<node TEXT="エンタープライズ" POSITION="left"/>
</node>
</map>

ここでは例にあるように単純なTEXTとPOSITIONのみを扱うことにします。

準備

Commosn Betwixtを使います。Betwixtに関しての説明はこちらをどうぞ!

JavaBeanクラスを作成する

MapエレメントとNodeエレメントに対応するJavaBeanを作成する必要があります。

Map

Mapにはバージョン情報がありますが、今回は0.7.1の固定値とします。

するとNodeのみ追加する形になります。

そうなると、以下のようになります。

/*
 * Created on 2004/10/20
 * Author aki@www.xucker.jpn.org
 * License Apache2.0 or Common Public License
 */
package org.jpn.xucker.freemind;

import java.util.List;
import java.util.Vector;

/**
 * 
 *
 */
public class Map {
    List nodeList=new Vector();
    public void addNode(Node node){
        nodeList.add(node);
    }

    public Node[] getNodes(){
        return (Node[])nodeList.toArray(new Node[nodeList.size()]);
    }
}

Node

NodeはTitleとPositionの文字列があり、またNodeを追加できる形になります。

するとこうなります。

package org.jpn.xucker.freemind;

import java.util.List;
import java.util.Vector;

/**
 * 
 *
 */
public class Node {

private String text;
private String position;
List nodeList=new Vector();
/**
 * @param string
 */
public Node(){
    
}
public Node(String string) {
    this.text=string;
}
public String getPosition() {
    return position;
}
public void setPosition(String position) {
    this.position = position;
}
public String getText() {
    return text;
}
public void setText(String text) {
    this.text = text;
}
public void addNode(Node node){
    nodeList.add(node);
}

public Node[] getNodes(){
    return (Node[])nodeList.toArray(new Node[nodeList.size()]);
}
}

betwixtファイルを用意する

そして、betwixtファイルも用意します。属性を大文字にするため以下のようなbetwixtファイルを用意します。


Map.betwixt

<?xml version='1.0' encoding='Shift_JIS' ?>
<info primitiveTypes="attribute">
<element name='map'>
<attribute name="version" value="0.7.1"/>
<element name="node" property="nodes"/>
<addDefaults/>
</element>
</info>

Node.betwixt

<?xml version='1.0' encoding='Shift_JIS' ?>
<info primitiveTypes="attribute">
<element name='node'>
<attribute name="TEXT" property="text"/>
<attribute name="POSITION" property="position"/>
<element name="node" property="nodes"/>
<addDefaults/>
</element>
</info>

読み込む

ここまで容易できたら後は、簡単です。TEXTの値がエンコードされてますが、

読み込み時には自動でデーコードされます。

なので、以下のようなメソッドでXMLファイルを、Mapクラスを読み込めます。

XMLファイルをFileReaderに変換する必要がありますが。

public static Map readMap(Reader input){
    BeanReader reader=new BeanReader();
    //reader.getBindingConfiguration().setObjectStringConverter(new ConvertUtilsObjectStringConverter());
    Map map=null;
    try {
        reader.registerBeanClass(Map.class);
        map=(Map)reader.parse(input);
    } catch (IntrospectionException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    return map;
}

書き出す

書き出しに関して、ここは私の勉強不足のため、すごくブサイクなコードになっています。

betwixt上で、属性のCharのエンコードの制御の仕方を知らないからです。

非アスキーコードは、手動で、toHexStringしています。

public static void writeMap(Writer output,Map map){
    BeanWriter writer =null;
    BindingConfiguration config=new BindingConfiguration();
    config.setMapIDs(false);
    
    writer.setBindingConfiguration(config);
    
        StringWriter out=new StringWriter();
        writer= new BeanWriter(out);
    
   
    try {
        writer.write(map);
        writer.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IntrospectionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
   
   
    String text=out.getBuffer().toString();
    
    for(int i=0;i<text.length();i++){
     if((int)text.charAt(i)>0x7f){
          try {
            output.write(toHexString(text.charAt(i)));
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
     }else{
         try {
             output.write((int)text.charAt(i));
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
     }
    }
}

public static String toHexString(char ch){
    int v=(int)ch;
    String hex=Integer.toHexString(v);
    return "&#x"+hex+";";
}

関連

tab2tree テキスト(TabTreeをHTML風のTreeやFreeMind形式に出力)でこのコードを使用しています。


このエントリーを含むはてなブックマーク このエントリーを含むECナビ人気ニュース