Pull 解析器的運行方式與 SAX 解析器相似。它提供了類似的事件,如: 開始元素和結束元素事件,使用 parser.next() 可以進入下一個元素並觸發相應事件。跟 SAX 不同的 是, Pull 解析器產生的事件是一個數字,而非方法,
首先先在Assets目錄下創建file.xml 加入如下的內容
<?xml version="1.0"?>
<records>
<employee>
<name>張飛</name>
<surname>張</surname>
<salary>50000</salary>
</employee>
<employee>
<name>孫權 </name>
<surname>孫</surname>
<salary>60000</salary>
</employee>
<employee>
<name>魯智深</name>
<surname>魯</surname>
<salary>70000</salary>
</employee>
</records>
編寫activity代碼
package com.example.abc.xmlpaserdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class PullActivity extends AppCompatActivity {
private static final String TAG =PullActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sax);
try {
InputStream is = getAssets().open("file.xml");
List<Employee> employees = pull2xml(is);
for(Employee employee:employees){
Log.i(TAG, "onCreate: " +employee.toString());
}
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
private List<Employee> pull2xml(InputStream is) throws XmlPullParserException, IOException {
List<Employee> list = null;
Employee employee = null;
XmlPullParser parser = Xml.newPullParser();
///初始化xmlPull解析器
parser.setInput(is, "utf-8");
//讀取文件的類型
int type = parser.getEventType();
//無限判斷文件類型進行讀取
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
//開始標籤
case XmlPullParser.START_TAG:
if ("records".equals(parser.getName())) {
list = new ArrayList<>();
} else if ("employee".equals(parser.getName())) {
employee = new Employee();
} else if ("name".equals(parser.getName())) {
//獲取name值
String name = parser.nextText();
employee.setName(name);
} else if ("surname".equals(parser.getName())) {
//獲取nickName值
String surname = parser.nextText();
employee.setSurName(surname);
} else if ("salary".equals(parser.getName())) {
//獲取nickName值
String salary = parser.nextText();
employee.setSalary(Integer.parseInt(salary));
}
break;
//結束標籤
case XmlPullParser.END_TAG:
if ("employee".equals(parser.getName())) {
list.add(employee);
}
break;
}
//繼續往下讀取標籤類型
type = parser.next();
}
return list;
}
}
效果圖: