Die Verwendung von XmlPullParser auf Android ist eine hocheffiziente und einfach zu wartende Methode zum Parsen von XML. Android hatte in der Vergangenheit zwei Implementierungsklassen, die diese Schnittstelle implementieren:
KXmlParser über XmlPullParserFactory.newPullParser().
ExpatPullParser, über Xml.newPullParser().
Es gibt einen Fehler bei der Implementierung von Xml.newPullParser() zum Aufrufen von nextText(). nextText() wird nicht immer vor END_TAG ausgeführt, wie in der Dokumentation erwähnt.
Daher können bei einigen Anwendungen Fehler bei zusätzlichen Aufrufen von next() oder nextTag() auftreten.
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>")); }
In Android 4.0 wurde Xml.newPullParser() geändert, um den KxmlParser zurückzugeben class , während die ExpatPullParser-Klasse entfernt wird. Dies behebt den nextTag()-Fehler. Leider sind alle aktuellen Anwendungen, die abstürzen können, niedriger als Android 4.0.
Die Lösung besteht darin, nextTag() erst nach dem Aufruf von nextText() aufzurufen, nur wenn die aktuelle Position nicht END_TAG ist.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)
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); }
private String safeNextText(XmlPullParser parser) throws XmlPullParserException, IOException { String result = parser.nextText(); if (parser.getEventType() != XmlPullParser.END_TAG) { parser.nextTag(); } return result; }
Das Obige ist der Inhalt der XmlPullParser.netText()-Methode. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).