YahooAPIをXMLBeansで作りかえ。
以前YahooのWEBサービスをJavaで利用できるようなAPI
(実際は、ネットワーク系のユーティリティと、オブジェクトバインディングしているだけ)
を作って、ひそやかに公開していたわけですが、
いないと思っていた利用者からの障害報告*1を受け、
再度生成し直した時に思ったわけです。
JaxMe2ってどうなのかな?と。
というわけで、
おそらく今後スタンダードの位置をつっぱしるであろう(主観)、
XMLBeansをつかって作りなおしてみようと思い立ったわけです。
ちなみに、YahooのWebサービスですが、自分でも使用していなかったりしますが、
IDがあるのと、SOAPではなくRESTであることを鑑みて題材にしたというのが適切・・・
サンプルはこちら
https://mokkouyou.dnsdojo.com/file/YahooAPI_XMLBeans.lzh
XMLBeansって・・・・
省略。
解説サイトにおまかせ。
http://www.ibm.com/developerworks/jp/opensource/library/os-ag-soa/
もともと、BEAプロダクトなので、情報も多いはず。
とりあえずは、オブジェクトとXMLのバインディングツールだと思えばよし。
準備
XMLBeansのインストールを済ます。(2.3.0)
XMLBEANS_HOMEとする。(環境変数に設定する必要はない)
Eclipseで適当にJavaプロジェクトを作る。
直下にschemasフォルダ、libフォルダ、srcフォルダ(ソースディレクトリ)、gensrc(ソースディレクトリ)を作成。
srcは、成果物を利用するようなソースの配置を想定。※jarを作るだけなら不要。
http://developer.yahoo.co.jp/
より、Yahoo!検索の結果xsdを取得して、schemasに配置する。
旧YahooAPIを流用するので、WEB、Image、Videoの3つ。
※拡張子xsdで保存すること。
XMLBEANS_HOME/lib
のjarを、libフォルダに配置する。(ビルドバスに追加)
ちなみに
xsdが用意されていなかったり(そんなサービスはないと思うが)
自分で作るんだけど、xsd定義めんどい・・・とか、
Relaxerなんだけど・・・
とかいう場合は、Trungを使うととっても便利。
buildファイル
サンプルのbuildを流用して編集。
べた書き・・・
<?xml version="1.0" encoding="utf-8"?> <project name="YahooAPIv2" default="build"> <target name="init"> <!-- check for xbean.jar from binary distribution --> <available property="xmlbeans.lib" value="lib" file="lib/xbean.jar" /> <!-- check for xbean.jar compiled from source --> <available property="xmlbeans.lib" value="build/lib" file="build/lib/xbean.jar" /> <fail message="Set XMLBEANS_HOME in your environment." unless="xmlbeans.lib"/> <echo message="xmlbeans.lib: ${xmlbeans.lib}"/> <path id="xmlbeans.path"> <fileset dir="${xmlbeans.lib}" includes="*.jar"/> </path> <taskdef name="xmlbean" classname="org.apache.xmlbeans.impl.tool.XMLBean" classpathref="xmlbeans.path"/> </target> <!-- ========================== clean ==== --> <target name="clean"> <delete dir="build"/> </target> <!-- ========================== build ==== --> <target name="build" depends="init,schemas.jar"> </target> <target name="schemas.check"> <uptodate property="schemas.notRequired" targetfile="build/lib/schemas.jar"> <srcfiles dir="schemas" includes="**/*.xsd"/> </uptodate> </target> <!-- jar 不要の場合には、srconlyを指定する。 ※実行時には、jarが必要となる。 下記は、jarのみ。 詳しくは、下記参照 http://xmlbeans.apache.org/docs/2.0.0/guide/antXmlbean.html typesystemnameは、生成されるソースのパッケージではないので注意 --> <target name="schemas.jar" depends="init,schemas.check" unless="schemas.notRequired"> <mkdir dir="build/lib"/> <xmlbean schema="schemas" destfile="build/lib/schemas.jar" classpathref="xmlbeans.path" srcgendir="gensrc" debug="on" /> </target> </project>
パッケージを指定したい
なんだか、ここで生成ソースに対するパッケージの指定が出来ない・・・
というわけで、パッケージの指定をしたい場合は、以下参照
http://wiki.apache.org/xmlbeans/XmlBeansFaq?highlight=%28package%29#configPackageName
簡単に言うと、
以下内容の.xsdconfigをschemasに配置しろ。との事。
<xb:config xmlns:pol="http://openuri.org/easypoLocal" xmlns:xb="http://www.bea.com/2002/09/xbean/config"> <xb:namespace uri="urn:yahoo:jp:srch"> <xb:package>com.dnsdojo.mokkouyou.yahoo.result.web</xb:package> </xb:namespace> <xb:namespace uri="urn:yahoo:jp:srchmi"> <xb:package>com.dnsdojo.mokkouyou.yahoo.result.image</xb:package> </xb:namespace> <xb:namespace uri="urn:yahoo:jp:srchmv"> <xb:package>com.dnsdojo.mokkouyou.yahoo.result.video</xb:package> </xb:namespace> <!-- If schema doesn't include targenamespace then use <xb:namespace uri="##any"> <xb:package>org.openuri.easypo.xsdconfig</xb:package> </xb:namespace> --> </xb:config>
その他
あとは、生成されたjarにパス通して、開いたコネクションから
InputStreamを、渡してやればよいです。
結局は、XMLBeanの使用法通りなんだけど、APIと名乗る以上、
RESTの組み立ても。
定数
package com.dnsdojo.mokkouyou.yahoo.cons; import java.util.Collections; import java.util.HashSet; import java.util.Set; /** * ウェブ検索で使用する定数クラス<br> * デフォルト値については定義しない。 * @author mokkouyou * @version 1.0 */ public class WebQueryConst { private String value; private WebQueryConst(String value) { this.value = value; } public String toString() { return value; } /** * 検索結果にアダルトコンテンツを含む */ public static final WebQueryConst ADULT_OK = new WebQueryConst("1"); /** * 検索条件をOR検索とする */ public static final WebQueryConst TYPE_ANY = new WebQueryConst("any"); /** * 検索条件を文章とする */ public static final WebQueryConst TYPE_PHRASE = new WebQueryConst("phrase"); /** * 検索で取得するフォーマットをHTMLで指定する。 */ public static final WebQueryConst FORMAT_HTML = new WebQueryConst("html"); /** * 検索で取得するフォーマットをWORDで指定する。 */ public static final WebQueryConst FORMAT_MSWORD = new WebQueryConst("msword"); /** * 検索で取得するフォーマットをPDFで指定する。 */ public static final WebQueryConst FORMAT_PDF = new WebQueryConst("pdf"); /** * 検索で取得するフォーマットをPPTで指定する。 */ public static final WebQueryConst FORMAT_PPT = new WebQueryConst("ppt"); /** * 検索で取得するフォーマットをRSSで指定する。 */ public static final WebQueryConst FORMAT_RSS = new WebQueryConst("rss"); /** * 検索で取得するフォーマットをTXTで指定する。 */ public static final WebQueryConst FORMAT_TXT = new WebQueryConst("txt"); /** * 検索で取得するフォーマットをXLSで指定する。 */ public static final WebQueryConst FORMAT_XLS = new WebQueryConst("xls"); /** * 検索を同じコンテンツでも別結果で指定する */ public static final WebQueryConst SIMILAR_OK = new WebQueryConst("1"); private static Set adultSet = null; /** * key adult_okに対する値Set */ public synchronized static final Set getAdultSet() { if(adultSet == null) { Set set = new HashSet(); set.add(ADULT_OK); adultSet = Collections.unmodifiableSet(set); } return adultSet; } private static Set similarSet; /** * key similar_okに対する値Set */ public synchronized static final Set getSimilarSet(){ if(similarSet == null) { Set set = new HashSet(); set.add(SIMILAR_OK); similarSet = Collections.unmodifiableSet(set); } return similarSet; } private static Set formatSet; /** * key formatに対する値Set */ public synchronized static final Set getFormatSet() { if(formatSet == null) { Set set = new HashSet(); set.add(FORMAT_HTML); set.add(FORMAT_MSWORD); set.add(FORMAT_PDF); set.add(FORMAT_PPT); set.add(FORMAT_RSS); set.add(FORMAT_TXT); set.add(FORMAT_XLS); formatSet = Collections.unmodifiableSet(set); } return formatSet; } private static Set typeSet; /** * key typeに対する値Set */ public synchronized static final Set getTypeSet() { if(typeSet == null) { HashSet set = new HashSet(); set.add(TYPE_ANY); set.add(TYPE_PHRASE); typeSet = Collections.unmodifiableSet(set); } return typeSet; } }
Queryの保持クラス
package com.dnsdojo.mokkouyou.yahoo.query; import java.net.URLEncoder; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import com.dnsdojo.mokkouyou.yahoo.cons.WebQueryConst; /** * ウェブ検索で使用するクエリ付きURLを生成する。<br> * 入力チェックは行わない。<br> * 必要な値を設定した後にcreateQueryString()を呼ぶ。 * @author mokkouyou * @version 1.0 */ public class WebQuery { private static Set allowedKeySet; { allowedKeySet = new HashSet(); allowedKeySet.add(ADULT_KEY); allowedKeySet.add(APPLID_KEY); allowedKeySet.add(COUNTRY_KEY); allowedKeySet.add(FORMAT_KEY); allowedKeySet.add(LANGUAGE_KEY); allowedKeySet.add(QUREY_KEY); allowedKeySet.add(RESULT_KEY); allowedKeySet.add(SIMILAR_KEY); allowedKeySet.add(START_KEY); allowedKeySet.add(TYPE_KEY); } private Map map = new HashMap(); /** * 必須 */ private static final String APPLID_KEY = "appid"; private String applId; /** * 必須 (UTF-8エンコードされた)検索クエリーです。このクエリーはYahoo!検索の全言語をサポートし、またメタキーワードも含みます。 */ private static final String QUREY_KEY = "query"; private String query; /** * all(デフォルト), any, phrase 指定検索の種類: allは全クエリー文字を含む検索結果を返します。 * anyはクエリー文字のうちいずれかを含む検索結果を返します。 phraseはクエリー文字を文章として含む検索結果を返します。 * */ private static final String TYPE_KEY = "type"; private String type; /** * integer: 10(デフォルト), 50(最大) 返却結果の数です。 */ private static final String RESULT_KEY = "results"; private String resultCount; /** * start integer: 1(デフォルト) 返却結果の先頭位置(1 - based)です。最終位置(start + results - * 1)は、1000を超えられません。 */ private static final String START_KEY = "start"; private String start; /** * format any(デフォルト), html, msword, pdf, ppt, rss, txt, xls * 検索するファイルの種類を指定します。 */ private static final String FORMAT_KEY = "format"; private String format; /** * adult_ok 値なし(デフォルト), 1 アダルトコンテンツの検索結果を含めるかどうかを指定します。1の場合はアダルトコンテンツを含みます。 */ private static final String ADULT_KEY = "adult_ok"; private String adult; /** * * similar_ok 値なし(デフォルト), 1 同じコンテンツを別の検索結果とするかどうかを指定します。1の場合は同じコンテンツを含みます。 */ private static final String SIMILAR_KEY = "similar_ok"; private String similar; /** * language string: ja(デフォルト) languageで書かれた結果になります。「サポートしている言語」をご参照ください。 * アイスランド語 is アラビア語 ar イタリア語 it インドネシア語 id 英語 en エストニア語 et オランダ語 nl カタロニア語 * ca 韓国語 ko ギリシャ語 el クロアチア語 hr スウェーデン語 sv スペイン語 es スロバキア語 sk スロベニア語 sl * セルビア語 sr タイ語 th チェコ語 cs 中国語(簡体字) szh 中国語(繁体字) tzh デンマーク語 da トルコ語 tr ドイツ語 * de 日本語 ja ノルウェー語 no ハンガリー語 hu フィンランド語 fi フランス語 fr ブルガリア語 bg ヘブライ語 he * ペルシャ語 fa ポルトガル語 pt ポーランド語 pl ラトビア語 lv リトアニア語 lt ルーマニア語 ro ロシア語 ru * */ private static final String LANGUAGE_KEY = "language"; private String language; /** * country string: 値なし(デフォルト) ウェブサイトが位置する国の国コードです。「サポートしている国・地域」をご参照ください。 * アメリカ us アルゼンチン ar イギリス uk イタリア it オランダ nl オーストラリア au オーストリア at カナダ ca 韓国 * kr スイス ch スウェーデン se スペイン es 台湾 tw チェコ cz 中国 cn デンマーク dk ドイツ de 日本 jp * ノルウェー no フィンランド fi フランス fr ブラジル br ベルギー be ポーランド pl ロシア ru */ private static final String COUNTRY_KEY = "country"; private String country; /** * * site string: 値なし(デフォルト) 検索するドメイン(例えば * www.mokkouyou.yahoo.co.jp)を制限します。30ドメインまで指定することができます * (site=www.mokkouyou.yahoo.co.jp&site=www.asahi.com)。 */ private static final String SITE_KEY = "site"; /** * adult_ok 値なし(デフォルト), 1 <br> * アダルトコンテンツの検索結果を含めるかどうかを取得。 <br> * 1の場合はアダルトコンテンツを含みます。 * * @return Returns the adult. */ public String getAdult() { return adult; } /** * * adult_ok 値なし(デフォルト), 1 <br> * アダルトコンテンツの検索結果を含めるかどうかを指定します。 <br> * 1の場合はアダルトコンテンツを含みます。 * * @param adult * adult を設定する。 */ public void setAdult(WebQueryConst adult) { if(WebQueryConst.getAdultSet().contains(adult)) { this.adult = adult.toString(); map.put(ADULT_KEY, this.adult); } } /** * key adult_okを初期値に戻す。 * */ public void clearAdult() { this.adult = null; map.remove(ADULT_KEY); } /** * アプリケーションID * * @return Returns the applId. */ public String getApplId() { return applId; } /** * アプリケーションIDを指定する。 * * @param applId * applId を設定する。 */ public void setApplId(String applId) { this.applId = applId; map.put(APPLID_KEY, this.applId); } /** * key appIdを初期値に戻す。 * */ public void clearApplId() { this.applId = null; map.remove(APPLID_KEY); } /** * country string: 値なし(デフォルト) ウェブサイトが位置する国の国コードです。 <br> * 「サポートしている国・地域」 <br> * アメリカ us <br> * アルゼンチン ar <br> * イギリス uk <br> * イタリア it <br> * オランダ nl <br> * オーストラリア au <br> * オーストリア at <br> * カナダ ca <br> * 韓国 kr <br> * スイス ch <br> * スウェーデン se <br> * スペイン es <br> * 台湾 tw <br> * チェコ cz <br> * 中国 cn <br> * デンマーク dk <br> * ドイツ de <br> * 日本 jp <br> * ノルウェー no <br> * フィンランド fi <br> * フランス fr <br> * ブラジル br <br> * ベルギー be <br> * ポーランド pl <br> * ロシア ru * * @return Returns the country. */ public String getCountry() { return country; } /** * country string: 値なし(デフォルト) ウェブサイトが位置する国の国コードです。 <br> * 「サポートしている国・地域」 <br> * アメリカ us <br> * アルゼンチン ar <br> * イギリス uk <br> * イタリア it <br> * オランダ nl <br> * オーストラリア au <br> * オーストリア at <br> * カナダ ca <br> * 韓国 kr <br> * スイス ch <br> * スウェーデン se <br> * スペイン es <br> * 台湾 tw <br> * チェコ cz <br> * 中国 cn <br> * デンマーク dk <br> * ドイツ de <br> * 日本 jp <br> * ノルウェー no <br> * フィンランド fi <br> * フランス fr <br> * ブラジル br <br> * ベルギー be <br> * ポーランド pl <br> * ロシア ru * * @param country * country を設定する。 */ public void setCountry(String country) { this.country = country; map.put(COUNTRY_KEY, this.country); } /** * key countryを初期値に戻す * */ public void clearCountry() { this.country = null; map.remove(COUNTRY_KEY); } /** * format any(デフォルト), html, msword, pdf, ppt, rss, txt, xls <br> * 検索するファイルの種類を指定します。 * * @return Returns the format. */ public String getFormat() { return format; } /** * format any(デフォルト), html, msword, pdf, ppt, rss, txt, xls <br> * 検索するファイルの種類を指定します。 * * @param format * format を設定する。 */ public void setFormat(WebQueryConst format) { if(WebQueryConst.getFormatSet().contains(format)) { this.format = format.toString(); map.put(FORMAT_KEY, this.format); } } /** * key formatを初期値に戻す。 * */ public void clearFormat() { this.format = null; map.remove(FORMAT_KEY); } /** * language string: ja(デフォルト) <br> * languageで書かれた結果になります。 <br> * 「サポートしている言語」 <br> * アメリカ us <br> * アルゼンチン ar <br> * イギリス uk <br> * イタリア it <br> * オランダ nl <br> * オーストラリア au <br> * オーストリア at <br> * カナダ ca <br> * 韓国 kr <br> * スイス ch <br> * スウェーデン se <br> * スペイン es <br> * 台湾 tw <br> * チェコ cz <br> * 中国 cn <br> * デンマーク dk <br> * ドイツ de <br> * 日本 jp <br> * ノルウェー no <br> * フィンランド fi <br> * フランス fr <br> * ブラジル br <br> * ベルギー be <br> * ポーランド pl <br> * ロシア ru * * @return Returns the language. */ public String getLanguage() { return language; } /** * language string: ja(デフォルト) <br> * languageで書かれた結果になります。 <br> * 「サポートしている言語」 <br> * アメリカ us <br> * アルゼンチン ar <br> * イギリス uk <br> * イタリア it <br> * オランダ nl <br> * オーストラリア au <br> * オーストリア at <br> * カナダ ca <br> * 韓国 kr <br> * スイス ch <br> * スウェーデン se <br> * スペイン es <br> * 台湾 tw <br> * チェコ cz <br> * 中国 cn <br> * デンマーク dk <br> * ドイツ de <br> * 日本 jp <br> * ノルウェー no <br> * フィンランド fi <br> * フランス fr <br> * ブラジル br <br> * ベルギー be <br> * ポーランド pl <br> * ロシア ru * * @param language * language を設定する。 */ public void setLanguage(String language) { this.language = language; map.put(LANGUAGE_KEY, this.language); } public void clearLanguage() { this.language = null; map.remove(LANGUAGE_KEY); } /** * 必須 (UTF-8エンコードされた)検索クエリーです。 <br> * このクエリーはYahoo!検索の全言語をサポートし、 <br> * またメタキーワードも含みます。 * * @return Returns the query. */ public String getQuery() { return query; } /** * 必須 (UTF-8エンコードされた)検索クエリーです。 <br> * このクエリーはYahoo!検索の全言語をサポートし、 <br> * またメタキーワードも含みます。 * * @param query * query を設定する。 */ public void setQuery(String query) { this.query = query; map.put(QUREY_KEY, this.query); } /** * key queryを初期に値に戻す。 * */ public void clearQuery(){ this.query = null; map.remove(QUREY_KEY); } /** * integer: 10(デフォルト), 50(最大) <br> * 返却結果の数です。 * * @return Returns the resultCount. */ public String getResultCount() { return resultCount; } /** * integer: 10(デフォルト), 50(最大) <br> * 返却結果の数です。 * * @param resultCount * resultCount を設定する。 */ public void setResultCount(int resultCount) { try { this.resultCount = String.valueOf(resultCount); map.put(RESULT_KEY, this.resultCount); }catch(Exception e) { } } /** * key result を初期値に戻す。 * */ public void clearResultCount(){ this.resultCount = null; map.remove(RESULT_KEY); } /** * similar_ok 値なし(デフォルト), 1 <br> * 同じコンテンツを別の検索結果とするかどうかを指定します。<br> * 1の場合は同じコンテンツを含みます。 * @return Returns the similar. */ public String getSimilar() { return similar; } /** * similar_ok 値なし(デフォルト), 1 <br> * 同じコンテンツを別の検索結果とするかどうかを指定します。<br> * 1の場合は同じコンテンツを含みます。 * @param similar * similar を設定する。 */ public void setSimilar(WebQueryConst similar) { if(WebQueryConst.getSimilarSet().contains(similar)) { this.similar = similar.toString(); map.put(SIMILAR_KEY, this.similar); } } /** * key similarを初期値に戻す。 * */ public void clearSimilar() { this.similar = null; map.remove(SIMILAR_KEY); } /** * site string: 値なし(デフォルト) <br> * 検索するドメイン(例えば * www.mokkouyou.yahoo.co.jp)を制限します。<br> * 30ドメインまで指定することができます * (site=www.mokkouyou.yahoo.co.jp&site=www.asahi.com)。 * @return Returns the site. */ public String getSite() { return site; } /** * site string: 値なし(デフォルト) <br> * 検索するドメイン(例えば * www.mokkouyou.yahoo.co.jp)を制限します。<br> * 30ドメインまで指定することができます * (site=www.mokkouyou.yahoo.co.jp&site=www.asahi.com)。 * @param site * site を設定する。 */ public void setSite(String site) { this.site = site; map.put(SITE_KEY, this.site); } /** * key siteを初期値に戻す。 * */ public void clearSite(){ this.site = null; map.remove(SITE_KEY); } /** * start integer: 1(デフォルト) <br> * 返却結果の先頭位置(1 - based)です。<br> * 最終位置(start + results - * 1)は、1000を超えられません。 * @return Returns the start. */ public String getStart() { return start; } /** * start integer: 1(デフォルト) <br> * 返却結果の先頭位置(1 - based)です。<br> * 最終位置(start + results - * 1)は、1000を超えられません。 * @param start * start を設定する。 */ public void setStart(int start) { try { this.start = String.valueOf(start); map.put(START_KEY, this.start); } catch (Exception e) { } } /** * key startを初期値に戻す。 * */ public void clearStart() { this.start = null; map.remove(START_KEY); } /** * all(デフォルト), any, phrase <br> * 指定検索の種類:<br> * allは全クエリー文字を含む検索結果を返します。<br> * anyはクエリー文字のうちいずれかを含む検索結果を返します。 <br> * phraseはクエリー文字を文章として含む検索結果を返します。 * * @return Returns the type. */ public String getType() { return type; } /** * all(デフォルト), any, phrase <br> * 指定検索の種類:<br> * allは全クエリー文字を含む検索結果を返します。<br> * anyはクエリー文字のうちいずれかを含む検索結果を返します。 <br> * phraseはクエリー文字を文章として含む検索結果を返します。 * * @param type * type を設定する。 */ public void setType(WebQueryConst type) { if(WebQueryConst.getTypeSet().contains(type)) { this.type = type.toString(); map.put(TYPE_KEY, this.type); } } /** * key typeを初期値に戻す。 * */ public void clearType() { this.type = null; map.remove(TYPE_KEY); } private String site; private static final String mainUrl = "http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?"; /** * 設定した値を元にクエリを構築する。 * @return クエリつきURL * @throws Exception クエリが設定されていない場合 */ public String createQueryString() throws Exception { Set set = map.keySet(); if(!set.contains(APPLID_KEY)) { throw new IllegalStateException("APPLICATION_IDを設定してください。"); } StringBuffer sb = new StringBuffer(); for (Iterator iter = set.iterator(); iter.hasNext();) { String element = (String) iter.next(); if(allowedKeySet.contains(element)) { sb.append(element). append("="). append(URLEncoder.encode((String)map.get(element), "UTF-8")). append("&"); } } String result = sb.toString(); if(result.endsWith("&")){ result = result.substring(0, result.length() - 1); } result = mainUrl + result; return result; } }
マーシャリング
package com.dnsdojo.mokkouyou.yahoo.util; import java.io.InputStream; /** * 結果をBeanで取得するためのユーティリティクラス。<br> * 結果が異常の場合のハンドリングは行わない。 * * @author mokkouyou * @version 1.0 */ public class UnMarshalling { /** * ウェブの検索結果を取得する。 * @param is InputStream * @return 検索結果Bean * @throws Exception XML解析に失敗した場合やURL接続に失敗した場合 */ public static com.dnsdojo.mokkouyou.yahoo.result.web.ResultSetDocument createWebResultSetDocument(InputStream is) throws Exception { com.dnsdojo.mokkouyou.yahoo.result.web.ResultSetDocument document = com.dnsdojo.mokkouyou.yahoo.result.web.ResultSetDocument.Factory.parse(is); return document; } /** * イメージの検索結果を取得する。 * @param is InputStream * @return 検索結果Bean * @throws Exception XML解析に失敗した場合やURL接続に失敗した場合 */ public static com.dnsdojo.mokkouyou.yahoo.result.image.ResultSetDocument createImageResultSetDocument(InputStream is) throws Exception { com.dnsdojo.mokkouyou.yahoo.result.image.ResultSetDocument document = com.dnsdojo.mokkouyou.yahoo.result.image.ResultSetDocument.Factory.parse(is); return document; } /** * ビデオの検索結果を取得する。 * @param is InputStream * @return 検索結果Bean * @throws Exception XML解析に失敗した場合やURL接続に失敗した場合 */ public static com.dnsdojo.mokkouyou.yahoo.result.video.ResultSetDocument createVideoResultSet(InputStream is) throws Exception { com.dnsdojo.mokkouyou.yahoo.result.video.ResultSetDocument document = com.dnsdojo.mokkouyou.yahoo.result.video.ResultSetDocument.Factory.parse(is); return document; } }
使用例
private static String proxyHost = ""; private static String proxyPort = ""; private static String applId = ""; public static void main(String[] args) { HttpURLConnection con = null; try { //条件組み立て WebQuery query = new WebQuery(); //ID query.setApplId(applId); //検索ワード query.setQuery("構造計算書偽造 千葉"); //検索件数 query.setResultCount(1); String string = query.createQueryString(); System.out.println(string); URLConnectionBuilder builder = new URLConnectionBuilder(string, proxyHost, proxyPort); HttpURLConnection.setFollowRedirects(false); builder.setInstanceFollowRedirects(false); builder.setRequestMethod("GET"); builder.setContentType("text/xml"); //実行する con = builder.createConnection(); ResultSetDocument rs = UnMarshalling.createWebResultSetDocument(con.getInputStream()); //あとはオブジェクトとして利用 ResultSet result = rs.getResultSet(); ResultType[] resultArray = result.getResultArray(); for (int i = 0; i < resultArray.length; i++) { ResultType element = resultArray[i]; System.out.println("title:" + element.getTitle()); System.out.println("link:" + element.getUrl()); } con.disconnect(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { //利用するには、以下を入れる・・・はず。少なくとも当初はそうだった・・・ //詳しくはhttp://developer.yahoo.co.jp/attribution/ System.out.println("Web Services by Yahoo! JAPAN\nYahoo!デベロッパーネットワーク(http://developer.yahoo.co.jp/)"); if(con != null) { con.disconnect(); } } }
とまぁ、こんな感じ。
パフォーマンス計測することもないし、
複雑なこともやる気ないので、
JaxMe2とどっちがよいの?
といわれると微妙。
個人的には、JaxMe2でいいと思っている・・・・
特にパッケージ指定に関する部分ではマイナスですね。
パッケージエクスプローラで見えなくなるし。
他に方法があればいいんだが・・・
*1:障害というか、Yahoo側のResponseField変更があったのが障害の原因なのですが・・・