本日は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で開放されていましたので、
そのように対応していたほうがより良いのかぁと思いました。