ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

XMLからJava(以外もOK)自動生成その2:DOMで、属性・テキスト・タグ名取り出し(1)

2005-04-19 13:19:03 | JavaとWeb
前のブログで取り上げた、パラメータと値のとりかたについてです。




今日のお題


XMLを読み込み、ハッシュマップにいれよう


前回はタグ名だけをとってきましたが、今回は、タグ名のほかに、属性やテキストの値もとってきます。
入力は、前回と同じです。

ハッシュマップへの入れ方


キー
#tagタグ名
#child子供があればYES、なければNO
#val子供があるとき Vector
vectorの1要素は、子供1つ分のハッシュマップ
ハッシュマップの構造は、この構造
子供がテキストのとき<tag>文字列</tag>のとき
その文字列
子供がなかったら<tag/>の形 null
それ以外
(アトリビュート名)
アトリビュートの値


 一応、その内容を出力してみました。

 なお、このプログラムでは、一番最後の子供のタグにのみ、テキスト項目を持つ形になっています。
 テキスト項目が任意のタグのところに入るようにするためには、拡張が必要です。
 次回以降に話すと思います。




■■ プログラム
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.util.*;

public class xmlReadTest {
	static	String	inFname = "testClass.xml";

	public static void main(String[] args) {

		try
		{
			//----------------------------------------------//
			//	Dom取得のためのお決まりの部分	  //
			//----------------------------------------------//
		      	// 入力ファイルを読み込み、Documentオブジェクトを取得
		      	Document doc = DocumentBuilderFactory.newInstance()
				         .newDocumentBuilder().parse(new File(inFname));


			//----------------------------------------------//
		    	// クラス名となる、ルート要素を取得して表示	  //
			//----------------------------------------------//
		      	Node root = doc.getDocumentElement();
		      	HashMap mp = null;

			//	XMLをハッシュマップに入れる
    			mp = nodeToHashMap(root);
    			
    			//	ハッシュマップの内容を、表示する
    			String[] key = (String[])mp.keySet().toArray(new String[0]);
    			for(int j = 0 ; j < key.length ; j ++)
    			{
    				System.out.println(key[j] + ":" + mp.get(key[j]));
    			}

		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * ノードの中身を取得して、ハッシュマップに入れる
	 * @param oneNode	ハッシュマップに入れるノード
	 */
	private static HashMap nodeToHashMap(Node oneItem)
	{
		HashMap ret = new HashMap();
 
				//	子ノードがあるかないか
  		if ( oneItem.hasChildNodes() == true )
  		{
  			NodeList chNode = oneItem.getChildNodes();
  			if ( ( chNode.getLength() == 1 ) && ( chNode.item(0).getNodeType() == Node.TEXT_NODE))
  			{
  				//	子ノードが1個で、それはテキスト=<tag>val</tag>の形
 				ret.put("#tag",oneItem.getNodeName());
  				ret.put("#val",chNode.item(0).getNodeValue());
 				ret.put("#child","NO");
			}
			else
			{
				//	子ノードがいっぱいある<tag><chtag>aaa</chtag><tag>
 				ret.put("#child","YES");
 				ret.put("#tag",oneItem.getNodeName());
 				Vector chVec = new Vector();
 				for (int j= 0 ; j < chNode.getLength(); j++)
 				{
 		  			if ( chNode.item(j).getNodeType() == Node.ELEMENT_NODE)
 		  			{
 		  				HashMap chMp = nodeToHashMap(chNode.item(j));
 		  				chVec.add(chMp);
 		  			}
 				}
 				ret.put("#val",chVec);
			}
		}
 		else
  		{
  				//	子ノードはない
				ret.put("#tag",oneItem.getNodeName());
  				ret.put("#val",null);
 				ret.put("#child","NO");
		}
  			
  			//	アトリビュートの設定
      		if ( oneItem.hasAttributes() == true)
      		{
      			NamedNodeMap attr = oneItem.getAttributes();
      			for (int j = 0 ; j < attr.getLength(); j ++ )
      			{
      				Node para = attr.item(j);
      				ret.put(para.getNodeName(),para.getNodeValue());
      			}
      		}
		return ret;
	}
}

■■ 結果
#tag:testClass
#child:YES
extends:absClass
#val:[{#tag=komoku1, #child=NO, #val=9999}, {#tag=komoku2, #child=NO, arrays=*, #val=XXX}, {#tag=komoku3, type=long, #child=NO, #val=null}]




このプログラムで使った、属性、値の取得メソッドなどの説明については、次回以降にします(ながくなるから)。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excelドキュメントからモデル駆動型アーキテクチャ(MDA)によるJavaソース自動生成を考える

2005-04-19 08:19:12 | JavaとWeb
 以前のブログで、ヒアリングからUMLのドキュメントを作成、Javaのクラス作成までを半自動化で行う手順 として、「UMLシステム設計実践技大全―アッと驚く達人の技」という本を元にまとめましたが、UMLにおける、ソースコードの自動化という話題は、モデル駆動型アーキテクチャ(MDA)でもやっているみたいですね。

 ということで、Excelのドキュメント(仕様書)から、このMDAのツールに読み込めれば、プログラムのソースコードを自動生成できるんじゃないかと空想した(ほんとかいな??)

 MDAのツールは、Java Worldの5月号に、AndroMDAが紹介されていたので、これにしようと思った。
 どうも、javaWorldの5月号を読んだ限りでは、もし、そのExcelの仕様書が、XMI形式で書き出せれば、変換できそうだ。
 でも、XMI形式って、どんなの??

 と思ったが、まあとりあえず、AndroMDAで、ソースコードを自動生成する方法をしらべた
 このブログにあった。

 そこを見て思った。モデリングツールが書き出すXMIを解析して、それと同じ形で、ExcelドキュメントからXMIが書き出せれば、自動生成できると。

 おお、モデリングツールをおとしてきましょう!
 ということで、ArgoUMLをダウンロードしてきた。

 夜も、おそくなった。
 今日は、ここまで。

(ちなみに、ブログは、朝、アップしているが、夜書いている。
 夜中に更新してしまうと、見る人が、少ないようだ)

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする