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

gooブログ「ウィリアムのいたずらの、まちあるき、たべあるき」がお引越ししてきました

DTDからJAXBを使ってできたJAVAのクラスを使い、読み込み書き出し


XMLをJavaのクラスにマッピングするプログラムを作る話、

・DTDからJAXBを使って、JAVAのクラスをつくるまで
・Javaのクラスをつかって、RSSを読み込み、値を取り出したりする

の2つの話に分けて、前回、「DTDからJAXBを使って、JAVAのクラスをつくるまで」をやりました。

今回、「Javaのクラスをつかって、RSSを読み込み、値を取り出したりする」部分をやりたいと思います。

具体的には、Eclipseで、プロジェクトをつくって、クラスを読み込み、それらクラスを利用して、値を出力したり、ファイルに書き出すプログラムを作成します。



■プロジェクトを作って、クラスを読み込む

 Eclipseをつかって、開発することにします。

 ってことで、ふつーにJavaのプロジェクトを作ってください。
 そしたら、generatedというパッケージを新規作成して、
 そのパッケージの中に、この前作ったJavaのファイルをインポートします(File Systemでインポート)



■プログラムを作る
 で、それらクラスを利用して、値を出力したり、ファイルに書き出すプログラムを作成します。
 パッケージなし(default package)のところに、このプログラム(呼び出しクラス)を作成します。
 今回は、JAXBTestという名前でクラスを作りました。

import javax.xml.bind.*;
import generated.*;
import java.net.*;
import java.util.*;
import java.io.*;

public class JAXBTest {
	public static void main(String[] args) throws Exception{

		//	返り値をクラスにセット
		JAXBContext context = JAXBContext.newInstance(new Class[] { generated.ObjectFactory.class });
		Unmarshaller unmarshaller = context.createUnmarshaller();
		Rss rss = (Rss)unmarshaller.unmarshal(new URL( "http://dailynews.yahoo.co.jp/fc/rss.xml" ));

		//とってきた値表示
		Channel c = rss.getChannel();
		List<Object> l = c.get★();
		for(int i =0; i < l.size() ; i ++)
		{
			if (l.get(i) instanceof Title)
			{
				Title t = (Title)l.get(i);
				System.out.println(t.getvalue());
			}
		}

		//	ファイルにかきだしてみる
		File newRss = new File("rss.xml");
		FileOutputStream fos = new FileOutputStream(newRss);
		Marshaller marshaller = context.createMarshaller();
		marshaller.marshal(rss,fos);

	}

}

(< > ¥ は本当は、半角。 ★の部分に関しては、後述)

 newInstanceのところ、Class[] { generated.ObjectFactory.class }としています。
generatedパッケージの下に、ObjectFactoryというクラスがあるとおもいます。
それをさしています。
jaxb.indexファイルを置く方法もあるようですが、なんか、うまくいかなかったし(配置するところ、間違えてるのかなあ?)、こっちのほうが、簡単です。

 で、http://dailynews.yahoo.co.jp/fc/rss.xmlという、YAHOOのRSSにアクセスしています。

 値をとってきて、表示するところなのですが、

 c.get★();

は、実は、以下のメソッドを呼び出しています。
c.getItemOrTitleOrLinkOrDescriptionOrLanguageOrCopyrightOrManagingEditorOrWebMasterOrPubDateOrLastBuildDateOrCategoryOrGeneratorOrDocsOrCloudOrTtlOrImageOrTextInputOrSkipHoursOrSkipDays();

(^^;)

なんか、|でつないでいるところは、全部メソッド名になってつながっちゃうみたいです。。。

うーん・・・(^^;)

ファイル書き出しは、マーシャル(marshal)するだけなので、らくちんらくちん。




で、ここまでだったら、たいした話ではないわけです。

問題は、このDTDからJavaのクラスを作った、xjcなんですけど・・・

・xjcは、XMLスキーマも扱える
・Accessは、XML書き出しで、XMLスキーマ(XSD)も書き出す。
・MySQLは、ODBC接続で、Accessにテーブルをリンクできる。

これを、逆からたどると、

・MySQLからAccessにODBC接続して、
・テーブルをXSDで書き出し
・それをxjcにかけると、自動的にJavaのクラスができる

はじめと最後だけ取り出すと、

・MySQLのテーブルを、Javaのクラスに変換できる。

ということになります(それも、XMLやRESTなどと同じような形式で)。

今度は、その方法について、書いてみたいと思います。