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

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

黄舟
リリース: 2017-02-09 13:58:14
オリジナル
1814 人が閲覧しました

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

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

  • ExpatPullParser、Xml.newPullParser() 経由。

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

そのため、next() または nextTag(); への追加呼び出しを行うときに一部のアプリケーションにバグが発生する可能性があります

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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 より前のバージョンです。次のエラー メッセージが表示されます。

1

2

3

4

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() を呼び出すことです。

1

2

3

4

5

6

7

8

9

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() が使用される次の補助メソッドを使用します。

1

2

3

4

5

6

7

8

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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート