XmlPullParserでのXML解析

で、つまづいた。

事の発端は今まで動いていたアプリがOS4.xの端末で動かなくなったとの報告から。
ログイン機能をもつアプリなんだけど、どうも返り値のXMLをパースしている部分でエラーを吐いているご様子。


W/System.err(19538): org.xmlpull.v1.XmlPullParserException: END_TAG expected (position:START_TAG <item>@1:35 in java.io.StringReader@2b01b478)
W/System.err(19538): at org.kxml2.io.KXmlParser.exception(KXmlParser.java:273)
W/System.err(19538): at org.kxml2.io.KXmlParser.nextText(KXmlParser.java:1444)

なるほど、さっぱりわからん。
END_TAGが来ないからご機嫌斜め、みたいな事をおっしゃっている気がする。
色々調べたところ、どうもOS4.0からXmlPullParserクラスのインスタンスが1つに統合されたらしい。
(そもそも2つあること自体知りませんでした)

XmlPullParserクラスのインスタンスは2つあり、

1)ExpatPullParser(android.util.XmlのstaticメソッドnewPullParser()を呼んで得る)
2)KXmlParser(XmlPullParserFactoryのインスタンスを取得し、そっからnewPullParser()を呼んで得る)

OS4.xではどちらの方法でインスタンスを取得してもKXmlParserの方が返されるようになっているみたいです。
で、このKXmlParserなんですが、タグが入れ子になっている部分でnextText()を呼び出すと上のエラーを吐く。


<aaa> ←ココ
 <bbb>opanchu!!</bbb>
</aaa>

ExpatPullParserちゃんは察してくれてたのに何でこの子は・・・。
で、こうなると何でもかんでもSTART_TAGだったらnextText()という処理が出来なくなる。
START_TAGの次にくるのがTEXT要素orEND_TAGなのか入れ子のSTART_TAGなのか判別しないといけない。
いけないんだけど、出来るのそんなこと・・・?

文頭でつまづいたって言ったけど、あれ嘘、今もつまづいてる。
解決したら続きを書きたいと思う、しなかったら知らない。


【追記】

nextText()メソッドをラップして例外キャッチしたら空文字返せばいいんじゃね?天才じゃね?
って思って以下のメソッドを作成。
private String wrappedNextText(XmlPullParser parser) {
 String ret;

  try {
  ret = parser.nextText();
 }
  catch(IOとParser e) {
    ret = "";
  }

  return ret;
}

結果、駄目でした。
現在の位置なんかが全然違ってきちゃうからその後の処理がボロボロ。
KXmlParserの動作を理解してからパース部分の処理を書き直すのが手っ取り早いのかな・・・。

ぬか喜びが過ぎるよね、もう帰ってTERAする。

コメント

このブログの人気の投稿

Activity以外からstartActivityする

in app billing v3 でサンドボックステストするときの話