Heim  >  Artikel  >  Backend-Entwicklung  >  Seien Sie vorsichtig mit der Methode XmlPullParser.netText()

Seien Sie vorsichtig mit der Methode XmlPullParser.netText()

黄舟
黄舟Original
2017-02-17 15:24:441296Durchsuche

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执行

hat nicht immer Vorrang vor

, 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=&#39;1.0&#39;?>"
                + "<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)!


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