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に変更することはメンテナンスを容易にし、システムパフォーマンスの改善に多くのエネルギーを割けるようになります。。
2011年12月31日
[Android][翻訳] XmlPullParser.nextText()に気をつけて
posted by t2low at 08:48| Android