ホームページ >バックエンド開発 >XML/RSS チュートリアル >XmlPullParser.netText() メソッドには注意してください

XmlPullParser.netText() メソッドには注意してください

黄舟
黄舟オリジナル
2017-02-09 13:58:141734ブラウズ

Android で XmlPullParser を使用することは、XML を解析するための非常に効率的で保守が簡単な方法です。 Android にはこれまで、このインターフェイスを実装する 2 つの実装クラスがありました:

  • KXmlParser (XmlPullParserFactory.newPullParser() 経由)。

  • ExpatPullParser、Xml.newPullParser() 経由。

nextText() を呼び出す Xml.newPullParser() の実装にはバグがあり、ドキュメントで説明されているように、 nextText() は必ずしも END_TAG より前に実行されるわけではありません。

そのため、next() または 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>"));  
}

Android 4.0 では、Xml.newPullParser() が KxmlParser クラスを返すように変更され、ExpatPullParser クラスが削除されました。これにより、nextTag() のバグが修正されます。

残念ながら、クラッシュする可能性のある現在のアプリケーションはすべて 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)

解決策は、現在の位置が END_TAG でない場合にのみ、nextText() を呼び出した後でのみ nextTag() を呼び出すことです。

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

上記のコードは、すべての XML バージョンを正しく解析できます。アプリケーションが nextText() を広範囲に使用する場合は、nextText() が使用される次の補助メソッドを使用します。

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

単一の XmlPullParse を使用すると、メンテナンスが簡素化され、システム パフォーマンスの向上により多くのエネルギーを費やすことができます。

上記は「XmlPullParser.netText() メソッドに注意してください」の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。