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

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

XMLからJava(以外もOK)自動生成 その1:JAXP(DOM)を使ってXMLのタグ名を出す

2005-04-16 22:27:06 | JavaとWeb
 前のブログで書いた「これから数回に

わけて、JAXPからXMLからJavaに変換するプログラムのお勉強を公開したいと思います。」についてです。
 なお、考えてみたら、別にJavaソースじゃなくっても、XMLからXMLスキーマやRelax,DTDへの変換でも、あるいは、DBのテーブル作成のDDLの自動生成でも、このやりかたでOKです。
 ではまず、なにを入力して、なにを出力するかについてです。




入力について

 以下のようなXMLを入力とします(どんなXMLの形式かについては、後日細かく説明します。簡単に言うと、クラス名がトップのタグ、その子供にクラスの中の変数があるようなもの。テーブル定義の場合、テーブル名がトップのタグ、カラム名がその子供にある場合です)。

<?xml version="1.0" encoding="Shift_JIS" ?>
<testClass extends="absClass">
	<komoku1>9999</komoku1>
	<komoku2 arrays="*">XXX</komoku2>
	<komoku3 type="long" />
</testClass>





出力について

以下のようなJavaプログラム(クラス)を出すことを考えます。
setterやgetterも出せることも考えます。


public class testClass extends absClass
{
	int		komoku1;
	String[]	komoku2;
	long		komoku3;
}



この入力と出力にかんしては、最終的にこういうものを出すという話です。




今回のお題


 今回の課題は、以下のとおりです。

■■ 課題
DOMを使って、入力のファイルを読み込み、そのタグ名をすべて表示しなさい


■■ プログラム

以下のとおりです。
JavaでHelloWorld XML(DOM)編を参考にさせてもらいました。

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class xmlReadTest {

	static	String	inFname = "testClass.xml";	//	入力ファイル

	public static void main(String[] args) {

		try
		{
			//----------------------------------------------//
			//	入力ファイルを読み込み		  //
			//----------------------------------------------//
		      	// 入力ファイルを読み込み、Documentオブジェクトを取得
			// (下の行、1行で書きたいんだけど、長いので途中で切った)
		      	Document doc = DocumentBuilderFactory.newInstance().
					  newDocumentBuilder().parse(new File(inFname));


			//----------------------------------------------//
		      	// クラス名となる、ルート要素を取得して表示	  //
			//----------------------------------------------//
		      	Element 	root = doc.getDocumentElement();
		      	System.out.println(root.getNodeName());

			//----------------------------------------------//
		      	// 子ノードを取得して、項目の表示		  //
			//----------------------------------------------//
			//	子ノード全部取得してリストへ
		      	NodeList childList = root.getChildNodes();
		      	for (int i = 0 ; i < childList.getLength();i++)
		      	{
				//	子ノード1個取り出し
		      		Node oneItem = childList.item(i);

				//	エレメントのとき(改行文字のテキストがありえるので)
		      		if ( oneItem.getNodeType() == Node.ELEMENT_NODE )
		      		{
					//	出力だぴょ
		      			System.out.println(oneItem.getNodeName());
		      		}
		      	}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}


■■ 結果
こんな感じ


testClass
komoku1
komoku2
komoku3


■■ 次回は
パラメータと値のとりかた。
いつやるか未定。

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

XMLからJavaに変換する話とか、JAX何とかのまとめとか(JAXPとJAXBの違いとか)

2005-04-16 09:43:10 | JavaとWeb
 いきなりですが、JAXなんとかとつく(JAXPとかJAXBとか)ののまとめです。
 @ITのここのページに載ってました。
 結局、こうなるみたい。

JAXなんとかのまとめ

JAXPXML文書を読み書き
JAXMSOAPのメッセージ用API
JAXBXMLとJavaのバインディング
JAXRUDDIのようなXMLレジストリアクセスAPI
JAX-RPCWebサービスを構築するためのAPI

*バインディング:「オブジェクトをマッピング」するって、具体的にはXMLとJavaを対応づける

で、表題のXMLからJavaに変換するには、普通JAXBの話になる。




JAXBでJavaのクラスを作るにはXMLのスキーマ必要

 で、JAXBのはなし。
 JAXBについては、ここに書かれているように、

XMLのスキーマ構造からJavaのクラスに変換するxjc
XMLのインスタンスとJavaのインスタンス間の変換を行うマーシャル・アンマーシャル

になる(そのページの図がわかりやすいと思います)

そのため、たとえば、開発のときにドキュメントからJavaのクラスを自動生成するために、JAXBを使おうとすると、ドキュメントからXMLのスキーマ構造に変換して、(xjcを使って)Javaのクラスを作ることになる。
 ところが、XMLのスキーマ構造である、XMLSchemaとか、DTDとか(Relaxも使えるのかな?)とかは、書くのがめんどっちい。
 目からビームが出るほどだ(でないでない)

 なんで、気軽にできない。
 とくに、手書きで書いてもらうことなんてできない。
 だから、ドキュメントからJavaで自動変換してもらうのは、どーなのどーなのと思ってた。




JAXPは、XMLのインスタンスを読み込み、展開する


 でも、ちょっとまてよ!と気づいた。

 JAXPを使えば、XMLのスキーマがなくても、インスタンスだけ読み込んで、そのままDOMとして展開できる。
 っていうことは、

(1)JAXPを使ってXML文書をDOMで読み込み
(2)読み込んだ内容をもとに、ファイル入出力で、JAVAのクラスを書き出せばいいじゃん


 そっかそっか、きっと、みんな、そーやってるのね(^^;)




 でも、ウィリアムのいたずら、JavaでDOMをつかったことないんですう。
 Access VBAなんかだとあるけど(その成果はこちら
 つーことで、一度にはできないので(べつに、ネタを出し渋っているわけではない。いくら、本家が、乙部綾子さんネタで、何度も分けて書いてるからって、ここもそれを狙って。。。??いないっす)、これから数回にわけて、JAXPからXMLからJavaに変換するプログラムのお勉強を公開したいと思います。

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