Heim >Backend-Entwicklung >XML/RSS-Tutorial >Seien Sie vorsichtig mit der Methode XmlPullParser.netText()
Auf Android Die Verwendung von XmlPullParser 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().
Implementieren Sie Xml.newPullParser()
den Aufruf von <span style="color:#007000">nextText()<code style="font-family:monospace; line-height:1em"><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>
Es liegt ein Fehler vor, nextText ( ) END_TAG执行
, wie in der Dokumentation erwähnt.
Daher können bei einigen Apps 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 Android4.0 ändert sich XML .newPullParser() gibt die KxmlParser-Klasse zurück und die ExpatPullParser-Klasse wird gelöscht. Dies behebt den Fehler von
nextTag()Leider handelt es sich bei den aktuellen Anwendungen, die abstürzen können, um Versionen niedriger als 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)
Die Lösung besteht darin, nextTag() erst nach dem Aufruf von nextText() zu verwenden , nur wenn der aktuelle Standort nicht END_TAG ist.
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); }
Der obige Code kann alle XML-Versionen korrekt analysieren. Wenn die Anwendung nextText() häufig verwendet, dann verwendet sie NextText(). verwendet die folgende Hilfsmethode.
private String safeNextText(XmlPullParser parser) throws XmlPullParserException, IOException { String result = parser.nextText(); if (parser.getEventType() != XmlPullParser.END_TAG) { parser.nextTag(); } return result; }
Die Verwendung eines einzigen XmlPullParse vereinfacht unsere Wartung und ermöglicht es uns, mehr Energie für die Verbesserung der Systemleistung aufzuwenden.
Das Obige ist der Inhalt der XmlPullParser.netText()-Methode. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!