Android で XmlPullParser を使用する は、XML を解析するための非常に効率的で保守が簡単な方法です。 Android にはこれまで、このインターフェイスを実装する 2 つの実装クラスがありました:
KXmlParser (XmlPullParserFactory.newPullParser() 経由)。
ExpatPullParser、Xml.newPullParser() 経由。
Xml.newPullParser()
を実装して <span style="color:#007000">nextText()<code style="color:rgb(0,112,0); font-family:monospace; line-height:1em">Xml.newPullParser()
调用<span style="color:#007000">nextText()</span><span style="background-color:rgb(255,255,255)">有个错误,<span style="color:rgb(0,112,0); font-family:monospace; line-height:12px">nextText()</span></span>
并不总是向文档中所提到优先于END_TAG执行
エラーがあります、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 クラスが削除されました。 。これにより、
のバグが修正されます。
残念ながら、クラッシュする可能性のある現在のアプリケーションはすべて 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)
解決策は、nextText()を呼び出した後、現在の位置がEND_TAGでない場合にのみ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 を使用すると、メンテナンスが簡素化され、システム パフォーマンスの向上により多くのエネルギーを費やすことができます。