Android pull解析

3312 ワード

XML解析は3種類ありますが、ここでAndroidのpull解析についてお話しします.
pull解析を使用すると、XmlPullParserのオブジェクトを取得する必要があります.2つの方法があります.
方法1:
Xmlを通ります.newPullParser();
例:XmlPullParserparser=Xml.newPullParser();
方法2:
XmlPullParserFactory経由
例:XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance ();
    factory . setNamespaceAware ( true );
    XmlPullParser xpp = factory . newPullParser();
公式ドキュメントの使用方法2.(優劣は私にもよくわかりませんが、はっきりした大神の伝言をお願いします)
XmlPullParserオブジェクトを取得すると、いくつかの定数が表す意味を理解します.
プロセッサのイベントの現在の状態は呼び出しによってgetEventType()メソッドを決定することができる.当初、このプロセッサはSTART_DOCUMENT状態であった.
next()メソッドは、解析器を次のイベントに進みます.返された整数値から、現在の解析器ステータスを決定します.次のイベントタイプはnext()によって表示されます.
START_TAGのXML開始ラベルが読み込まれます.
TEXTテキストコンテンツが読み込まれ、テキストコンテンツはgetText()メソッドで取得できます.(検証モードでのnext()は無視された空白を報告しません.代わりにnextToken()を使用します)
END_TAG一つの終了ラベル読みだし
END_DOCUMENTには解析できるイベントはありません
具体的な例を見てみましょう.
まずAndroidプロジェクトを建設し、androidを建設します.xmlはsrcに入れます
MainActivityにはbuttonが1つしかなく、PullActivityにジャンプするために使用され、コードは貼られません.
主にPullActivityのコードを見ます.
public class PullActivity extends Activity {

private PersonInfo personInfo;
private Boolean flag = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pull);
new MyAsyncTask().execute();
}

private InputStream getStream(String str) {
InputStream is = PullActivity.class.getClassLoader()
.getResourceAsStream(str);
return is;
}
private void PullAnalyze(InputStream stream) throws Exception {
//      XmlPullParser  
XmlPullParser parser = Xml.newPullParser();
//         
parser.setInput(stream, "UTF-8");
//         ,         
int eventCode = parser.getEventType();
//        ,      ,     
while (eventCode != XmlPullParser.END_DOCUMENT) {
switch (eventCode) {
case XmlPullParser.START_DOCUMENT: {
//                  
break;
}
case XmlPullParser.START_TAG: {
//       
if ("person".equals(parser.getName())) {
flag = true;
personInfo = new PersonInfo();
personInfo.setId(Integer.valueOf(parser
.getAttributeValue(0)));
}
if (flag) {
if ("name".equals(parser.getName())) {
//        ,       ,   log
System.out.println("------------>flag" + flag);
personInfo.setName(parser.nextText());

} else if ("age".equals(parser.getName())) {
personInfo.setAge(Integer.valueOf(parser.nextText()));
}
}
break;
}
case XmlPullParser.END_TAG: {
if ("person".equals(parser.getName()) && personInfo != null) {
flag = false;
System.out.println("--------------->personInfo"
+ personInfo.toString());
personInfo = null;
}
break;
}
}
//       
eventCode = parser.next();
}

}
private class MyAsyncTask extends AsyncTask<String, String, String> {

@Override
protected String doInBackground(String... params) {
try {
PullAnalyze(getStream("android.xml"));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

}

XML:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1" >
<name>qqq1</name>
<age>21</age>
</person>
<person id="2" >
<name>www2</name>
<age>22</age>
</person>
</persons>