Maison >développement back-end >Tutoriel XML/RSS >Soyez prudent avec la méthode XmlPullParser.netText()

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

黄舟
黄舟original
2017-02-09 13:58:141756parcourir

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

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)

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

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

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 (www.php.cn) !


Déclaration:
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
Article précédent:Android XPath analyse XMLArticle suivant:Android XPath analyse XML