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などと同じような形式で)。
今度は、その方法について、書いてみたいと思います。