Heim > Backend-Entwicklung > XML/RSS-Tutorial > Seien Sie vorsichtig mit der Methode XmlPullParser.netText()

Seien Sie vorsichtig mit der Methode XmlPullParser.netText()

黄舟
Freigeben: 2017-02-09 13:58:14
Original
1759 Leute haben es durchsucht

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=&#39;1.0&#39;?>"  
            + "<menu>"  
            + "  <item>Waffles</item>"  
            + "  <item>Coffee</item>"  
            + "</menu>"));  
}
Nach dem Login kopieren

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)
Nach dem Login kopieren


Der obige Code kann alle XML-Versionen korrekt analysieren. Wenn die Anwendung nextText() ausgiebig verwendet, verwenden Sie die folgende Hilfsmethode, bei der nextText() verwendet wird.
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);  
 }
Nach dem Login kopieren


Die Verwendung eines einzigen XmlPullParse vereinfacht unsere Wartung und ermöglicht es uns, mehr Energie für die Verbesserung der Systemleistung aufzuwenden.
private String safeNextText(XmlPullParser parser)  
         throws XmlPullParserException, IOException {  
     String result = parser.nextText();  
     if (parser.getEventType() != XmlPullParser.END_TAG) {  
         parser.nextTag();  
     }  
     return result;  
 }
Nach dem Login kopieren

Das Obige ist der Inhalt der XmlPullParser.netText()-Methode. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage