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

Seien Sie vorsichtig mit der Methode XmlPullParser.netText()

黄舟
黄舟Original
2017-02-09 13:58:141756Durchsuche

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>"));  
}

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)


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);  
 }


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;  
 }

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

Stellungnahme:
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
Vorheriger Artikel:Android XPath analysiert XMLNächster Artikel:Android XPath analysiert XML