今年の7月ぐらいから、twitterアプリでbasic認証が使えなくなったということで
oauth認証について勉強してみました。

認証方法が複雑で、かなり戸惑いましたが下記のブログで
図と一緒に詳しく解説してくれていたのですごく助かりました。

http://sites.google.com/site/elekmole/twitter4jtop/00-preparation/h-oauth-preparation

今回は認証部分の箇所を書いてみました。
下のような感じの実験的なアプリです。

$Yumakichiのブログ-スタート

$Yumakichiのブログ-pin

$Yumakichiのブログ-完了


oauth認証してアクセストークンを取得するだけのプログラムです。
twitter4jだと簡単にoauth認証もできる。

ソースコード
androidに限った話ではないですが・・・。

hotpepperやYouttubeなどのWebAPIで
xmlデータを解析した場合、ほとんどはString集合のリストとして扱うと思うのですが
経度のデータや緯度のデータを数値で扱いたいときがあると思うのです。

◆String型→int型
Integer.parseInt(string)

◆String型→double型
Double.parseDouble(string)

これでできます。
本日はxmlのParse(パース)方法について勉強しました。
パースは「解析」って意味らしいです・・・。

具体的には
youtubeとかぐるナビでWebAPIのサービスを使って情報を取得したい場合に使えるかなぁと思います。

では早速、パースしていきましょう。

androidではxmlをパースするための XmlPullParser というクラスが用意されているので
そちらを使用します。

javaコード的には


XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();


とこれだけです。XmlPullParserFactoryインスタンスを作成して
その実体を元にパーサーを作成します。
他にも方法があるようですが、たぶんこれが一番シンプルです。

次に、実際に解析する前に、上記で作成したパーサーに解析するデータを
セットしてあげます。


parser.setInput(解析したいxml内容);
または、
parser.setInput(解析したいxml内容,エンコード方法);


これだけです。「解析したいxml内容」とまとめてしまいましたが
メソッドに引き渡す内容としては上の場合はStringBuldar型で
下の場合はInputStream型だけ注意してください。
エンコード方法は、普通にString型で"UTF-8"とかで良いです。

ここまででパースする準備は整いました。

いよいよ解析していきますが、
解析イメージとしてはタグを上から1つずつ読んでいくという地道な作業です。
今回はサンプルとして「store」というタグで囲まれた要素(TEXT)を取り出してみます。

コードです。


String tagName;
String tagTEXT;
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
tagName = parser.getName();
if (tagName.equals("store")) {
parser.next();
tagText = parser.getTEXT();
Log.i("解析して取り出したstoreの内容",tagTEXT);
}
eventType = parser.next();
}


こんな感じです。
END_DOCUMENT(xmlデータの最後)までループを掛けて
その間でstoreタグを読み込んだ時だけ、parserをnextして
TEXTがあるだろう箇所にずらして値を取り出しています。

本来ならTEXTがあるだろう箇所にずらした際に、TEXTであることをチェックを入れるべきですが、
面倒なので今回は入れませんでした。


また、パーサをインスタンスを作成したり
パーサーで要素をずらす処理の際には例外が返却される可能性が
あるので、実際に使用する際にはtry~catchで囲ってあげる必要がありますので
適当にお願いします。

最後に、このブログの内容は私が尊敬している adamrockerさんのブログ内容を
かなり参考にさせてもらっているのですが
パース関連で作成したクラスをインスタンス化して使用した際には
使い終わったらnullで開放されていましたので、
そのように対応していたほうがより良いのかぁと思いました。