Soyez prudent avec la méthode XmlPullParser.netText()

黄舟
Libérer: 2017-02-09 13:58:14
original
1700 Les gens l'ont consulté

L'utilisation de XmlPullParser sur Android est une méthode très efficace et facile à maintenir pour analyser XML. Android a historiquement eu deux classes d'implémentation qui implémentent cette interface :

  • KXmlParser, via XmlPullParserFactory.newPullParser().

  • ExpatPullParser, via Xml.newPullParser().

Il y a un bug dans l'implémentation de Xml.newPullParser() pour appeler nextText(), nextText() n'est pas toujours exécuté avant END_TAG comme mentionné dans la documentation.

Par conséquent, certaines applications peuvent avoir des bugs dans les appels supplémentaires à next() ou 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=&#39;1.0&#39;?>"  
            + "<menu>"  
            + "  <item>Waffles</item>"  
            + "  <item>Coffee</item>"  
            + "</menu>"));  
}
Copier après la connexion

Dans Android 4.0, Xml.newPullParser() a été modifié pour renvoyer le KxmlParser class , tout en supprimant la classe ExpatPullParser. Cela corrige le bug nextTag()

Malheureusement, les applications actuelles qui peuvent planter sont toutes des versions inférieures à 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)
Copier après la connexion

La solution est d'appeler nextTag() uniquement après avoir appelé nextText(), uniquement lorsque la position actuelle n'est pas END_TAG.

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);  
 }
Copier après la connexion

Le code ci-dessus peut analyser correctement toutes les versions XML. Si l'application utilise largement nextText(), utilisez la méthode auxiliaire suivante où nextText() est utilisée.

private String safeNextText(XmlPullParser parser)  
         throws XmlPullParserException, IOException {  
     String result = parser.nextText();  
     if (parser.getEventType() != XmlPullParser.END_TAG) {  
         parser.nextTag();  
     }  
     return result;  
 }
Copier après la connexion

L'utilisation d'un seul XmlPullParse simplifie notre maintenance et nous permet de consacrer plus d'énergie à l'amélioration des performances du système.

Ce qui précède est le contenu de la méthode Soyez prudent avec la méthode XmlPullParser.netText() Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (m.sbmmt.com) !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!