2011年12月31日

[Android][翻訳] XmlPullParser.nextText()に気をつけて

Android Developers Blogの翻訳です。
英語に慣れるために翻訳しています。
誤訳が多々あると思うので、指摘いただけたら幸いです。


元の記事
http://android-developers.blogspot.com/2011/12/watch-out-for-xmlpullparsernexttext.html

--------------------------------

19 DECEMBER 2011
Tim Bray at 10:55 AM

Watch out for XmlPullParser.nextText()

XmlPullParser.nextText()に気をつけて

[This post is by Jesse Wilson from the Dalvik team. −Tim Bray]

Using XmlPullParser is an efficient and maintainable way to parse XML on Android. Historically Android has had two implementations of this interface:

AndroidでXMLをパースするのにXmlPullParserを使うことは、効率的で保守が容易です。これまでのAndroidは継承された2つのインターフェイスを持っていました。

KXmlParser, via XmlPullParserFactory.newPullParser ().

XmlPullParserFactory.newPullParser ()を使ったKXmlParser。

ExpatPullParser, via Xml.newPullParser().

Xml.newPullParser()を使ったExpatPullParser。

The implementation from Xml.newPullParser() had a bug where calls to nextText() didn’t always advance to the END_TAG as the documentation promised it would. As a consequence, some apps may be working around the bug with extra calls to next() or nextTag():

Xml.newPullParser()を使った実装は、nextText()を呼んだ時に常にEND_TAGまで進むことが保証されていないというバグがあります。
結果として、いくつかのアプリは別途next()やnextTag()を呼んで、このバグについて対処するかも知れません。

public void parseXml(Reader reader) 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 StringReade r(
                "<?xml version='1.0'?>" +
                "<menu>" +
                "<item>Waffles</item>" +
                "<item>Coffee</item>" +
                "</menu>"));
}

In Ice Cream Sandwich we changed Xml.newPullParser() to return a KxmlParser and deleted our ExpatPullParser class. This fixes the nextTag() bug. Unfortunately, apps that currently work around the bug may crash under Ice Cream Sandwich:

Ice Cream Sandwichでは、Xml.newPullParser()がKxmlParserを返すよう変更し、ExpatPullParserを削除しました。これによりnextTag()のバグが修正されます。残念ながら、バグを回避するアプリは、Ice Cream Sandwichより前のバージョンではクラッシュする可能性があります。

org.xmlpull.v1.XmlPullParserException: expe cted: END_TAG {null}item (position:START_TAG <item>@1:37 in java.io.StringReader@40442 fa8) at org.kxml2.io.KXmlParser.require(KXm lParser.java:2046) at com.publicobject.waffles.Menu.parse Xml(Menu.java:25) at com.publicobject.waffles.Menu.main(Menu .java:32)

The fix is to call nextTag() after a call to nextText() only if the current position is not an END_TAG:

この修正は、現在のポジションがEND_TAG以外のときだけ、nextText()の後にnextTag()を呼ぶようにするものです。

while (parser.nextTag() == XmlPullParser. START_TAG) {
    parser.require(XmlPullParser.START_TAG, null, "item");
    String itemText = parser.nextText();
    if (parser.getEventType() != XmlPullP arser.END_TAG) {
        parser.nextTag();
    }
    parser.require(XmlPullParser.END_TAG, null, "item");
    System.out.println("menu option: " + itemText);
}

The code above will parse XML correctly on all releases. If your application uses nextText() extensively, use this helper method in place of calls to nextText():

上記のコードはすべてのリリースでXMLを正しくパースするでしょう。もし、あなたのアプリケーションで広範囲にnextText()を使用していた場合、nextText()を呼んでいる箇所でこのヘルパーメソッドを使ってください。


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

Moving to a single XmlPullParser simplifies maintenance and allows us to spend more energy on improving system performance.

単独のXmlPullParserに変更することはメンテナンスを容易にし、システムパフォーマンスの改善に多くのエネルギーを割けるようになります。。
タグ:翻訳 android
posted by t2low at 08:48| Android