Android で XmlPullParser を使用することは、XML を解析するための非常に効率的で保守が簡単な方法です。 Android にはこれまで、このインターフェイスを実装する 2 つの実装クラスがありました:
nextText() を呼び出す Xml.newPullParser() の実装にはバグがあり、ドキュメントで説明されているように、 nextText() は必ずしも END_TAG より前に実行されるわけではありません。
そのため、next() または nextTag(); への追加呼び出しを行うときに一部のアプリケーションにバグが発生する可能性があります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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();
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 より前のバージョンです。次のエラー メッセージが表示されます。
1 2 3 4 | 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() を呼び出すことです。
1 2 3 4 5 6 7 8 9 | 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() が使用される次の補助メソッドを使用します。
1 2 3 4 5 6 7 8 | 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) に注目してください。