Android で XmlPullParser を使用することは、XML を解析するための非常に効率的で保守が簡単な方法です。 Android にはこれまで、このインターフェイスを実装する 2 つの実装クラスがありました:
KXmlParser (XmlPullParserFactory.newPullParser() 経由)。
ExpatPullParser、Xml.newPullParser() 経由。
nextText() を呼び出す Xml.newPullParser() の実装にはバグがあり、ドキュメントで説明されているように、 nextText() は必ずしも END_TAG より前に実行されるわけではありません。
そのため、next() または nextTag(); への追加呼び出しを行うときに一部のアプリケーションにバグが発生する可能性があります
throws XmlPullParserException, IOException { XmlPullParser parser = Xml.newPullParser(); parser.setInput(reader); parser.nextTag(); parser.require(XmlPullParser.START_TAG, null, "menu"); while (parser.nextTag() == XmlPullParser.START_TAG) { parser.require(XmlPullParser.START_TAG, null, "item"); String itemText = parser.nextText(); parser.nextTag(); // this call shouldn’t be necessary! parser.require(XmlPullParser.END_TAG, null, "item"); System.out.println("menu option: " + itemText); } parser.require(XmlPullParser.END_TAG, null, "menu"); } public static void main(String[] args) throws Exception { new Menu().parseXml(new StringReader("<?xml version='1.0'?>" + "<menu>" + " <item>Waffles</item>" + " <item>Coffee</item>" + "</menu>")); }
Android 4.0 では、Xml.newPullParser() が KxmlParser クラスを返すように変更され、ExpatPullParser クラスが削除されました。これにより、nextTag() のバグが修正されます。
残念ながら、クラッシュする可能性のある現在のアプリケーションはすべて Android 4.0 より前のバージョンです。次のエラー メッセージが表示されます。
org.xmlpull.v1.XmlPullParserException: expected: END_TAG {null}item (position:START_TAG <item>@1:37 in java.io.StringReader@40442fa8) at org.kxml2.io.KXmlParser.require(KXmlParser.java:2046) at com.publicobject.waffles.Menu.parseXml(Menu.java:25) at com.publicobject.waffles.Menu.main(Menu.java:32)
解決策は、現在の位置が END_TAG でない場合にのみ、nextText() を呼び出した後でのみ nextTag() を呼び出すことです。
while (parser.nextTag() == XmlPullParser.START_TAG) { parser.require(XmlPullParser.START_TAG, null, "item"); String itemText = parser.nextText(); if (parser.getEventType() != XmlPullParser.END_TAG) { parser.nextTag(); } parser.require(XmlPullParser.END_TAG, null, "item"); System.out.println("menu option: " + itemText); }
上記のコードは、すべての XML バージョンを正しく解析できます。アプリケーションが nextText() を広範囲に使用する場合は、nextText() が使用される次の補助メソッドを使用します。
private String safeNextText(XmlPullParser parser) throws XmlPullParserException, IOException { String result = parser.nextText(); if (parser.getEventType() != XmlPullParser.END_TAG) { parser.nextTag(); } return result; }
単一の XmlPullParse を使用すると、メンテナンスが簡素化され、システム パフォーマンスの向上により多くのエネルギーを費やすことができます。
上記は「XmlPullParser.netText() メソッドに注意してください」の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。