1. 代碼示例
數據放入Student類,這裏是測試代碼,放在了內部類裏面
@main/assets/layout.xml
<?xml version="1.0" encoding="utf-8"?>
<students>
<student>
<name>zhang san</name>
<sex>boy</sex>
<age>18</age>
<love>music world</love>
</student>
<student>
<name>zhang 1</name>
<sex>girl</sex>
<age>20</age>
<love>vidio world</love>
</student>
<sex>girl5</sex>
<age>205</age>
<love>vidio5 world</love>
</students>
@XmlParser.java
package com.tsp.util;
import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;
import android.util.Xml;
//android/libcore/xml/src/main/java/org/xmlpull/v1/XmlPullParser.java android自帶的類
import org.xmlpull.v1.XmlPullParser;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class XmlParser {
private static final String TAG = XmlParser.class.getSimpleName();
public void testAssetParserXml(Context context) {
AssetManager asset = context.getAssets();
try{
InputStream inputStream=asset.open("layout.xml");
List<Student> list = getStudents(inputStream);
for (Student stu : list){
Log.d(TAG, "xml list: " + stu.toString());
}
}catch (Throwable e){
e.printStackTrace();
}
}
public List<Student> getStudents(InputStream inputStream)throws Throwable{
List<Student> studentList = null;
Student mStudent = null;
//創建XmlPullParser
XmlPullParser parser= Xml.newPullParser();
//解析文件輸入流
parser.setInput(inputStream,"UTF-8");
//得到當前的解析對象
int eventType=parser.getEventType();
//當解析工作還沒完成時,調用next()方法得到下一個解析事件
while (eventType != XmlPullParser.END_DOCUMENT){
switch (eventType){
case XmlPullParser.START_DOCUMENT:
//解析開始的時候初始化list
studentList = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
//獲得解析器當前指向的元素的名字
//當指向元素的名字和id,name,sex這些屬性重合時可以返回他們的值
String XPPname = parser.getName();
Log.d(TAG, "name---: " + XPPname );
if ("student".equals(XPPname)){
//通過解析器獲取id的元素值,並設置一個新的Student對象的id
mStudent = new Student();
}
if (mStudent!=null)
{
if("name".equals(XPPname))
{
//得到當前指向元素的值並賦值給name
mStudent.setName(parser.nextText());
}
if("age".equals(XPPname))
{
//得到當前指向元素的值並賦值給age
mStudent.setAge(parser.nextText());
}
if("sex".equals(XPPname))
{
//得到當前指向元素的值並賦值給sex
mStudent.setSex(parser.nextText());
}
if("love".equals(XPPname))
{
//得到當前指向元素的值並賦值給sex
mStudent.setLove(parser.nextText());
}
}
break;
//出發結束元素事件
case XmlPullParser.END_TAG:
if("student".equals(parser.getName()))
{
studentList.add(mStudent);
mStudent = null;
}
break;
default:
break;
}
eventType = parser.next();
}
return studentList;
}
private class Student {
private String name;
private String sex;
private String age;
private String love;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getLove() {
return love;
}
public void setLove(String love) {
this.love = love;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age='" + age + '\'' +
", love='" + love + '\'' +
'}';
}
}
}
@MainActivity.java
XmlParser parser = new XmlParser();
parser.testAssetParserXml(this);
2.結果log
結果看上一個一個解析的,解析完一個,進入下一個循環
11-29 07:26:24.233 4003 4003 D XmlParser: name---: students
11-29 07:26:24.234 4003 4003 D XmlParser: name---: student
11-29 07:26:24.234 4003 4003 D XmlParser: name---: name
11-29 07:26:24.234 4003 4003 D XmlParser: name---: sex
11-29 07:26:24.234 4003 4003 D XmlParser: name---: age
11-29 07:26:24.234 4003 4003 D XmlParser: name---: love
11-29 07:26:24.234 4003 4003 D XmlParser: name---: student
11-29 07:26:24.234 4003 4003 D XmlParser: name---: name
11-29 07:26:24.234 4003 4003 D XmlParser: name---: sex
11-29 07:26:24.234 4003 4003 D XmlParser: name---: age
11-29 07:26:24.235 4003 4003 D XmlParser: name---: love
11-29 07:26:24.235 4003 4003 D XmlParser: name---: sex
11-29 07:26:24.235 4003 4003 D XmlParser: name---: age
11-29 07:26:24.235 4003 4003 D XmlParser: name---: love
11-29 07:26:24.235 4003 4003 D XmlParser: xml list: Student{name='zhang san', sex='boy', age='18', love='music world'}
11-29 07:26:24.235 4003 4003 D XmlParser: xml list: Student{name='zhang 1', sex='girl', age='20', love='vidio world'}
3. 擴展
3.1 修改添加xml
xml添加運動項目
<?xml version="1.0" encoding="utf-8"?>
<students>
<student>
<name>zhang san</name>
<sex>boy</sex>
<age>18</age>
<love>music world</love>
<sports>
<sportlist>ball</sportlist>
<sportlist>swimming</sportlist>
<sportlist>song</sportlist>
</sports>
</student>
<student>
<name>zhang 1</name>
<sex>girl</sex>
<age>20</age>
<love>vidio world</love>
<sports>
<sportlist>11</sportlist>
<sportlist>22</sportlist>
<sportlist>33</sportlist>
</sports>
</student>
<sex>girl5</sex>
<age>205</age>
<love>vidio5 world</love>
</students>
Student類添加變量
private List<String> sportlist;
public List<String> getSportlist() {
return sportlist;
}
public void setSportlist(List<String> sportlist) {
this.sportlist = sportlist;
}
getStudents()增加如下代碼
List<String> sports = null;
if("sports".equals(XPPname)) {
sports = new ArrayList<>();
}
if(sports != null) {
if("sportlist".equals(XPPname)) {
sports.add(parser.nextText());
mStudent.setSportlist(sports);
}
}
3.2 結果
最後結果得到了sportlist
11-29 07:43:03.837 4207 4207 D XmlParser: name---: students
11-29 07:43:03.837 4207 4207 D XmlParser: name---: student
11-29 07:43:03.837 4207 4207 D XmlParser: name---: name
11-29 07:43:03.838 4207 4207 D XmlParser: name---: sex
11-29 07:43:03.838 4207 4207 D XmlParser: name---: age
11-29 07:43:03.838 4207 4207 D XmlParser: name---: love
11-29 07:43:03.838 4207 4207 D XmlParser: name---: sports
11-29 07:43:03.838 4207 4207 D XmlParser: name---: sportlist
11-29 07:43:03.838 4207 4207 D XmlParser: name---: sportlist
11-29 07:43:03.838 4207 4207 D XmlParser: name---: student
11-29 07:43:03.838 4207 4207 D XmlParser: name---: name
11-29 07:43:03.838 4207 4207 D XmlParser: name---: sex
11-29 07:43:03.838 4207 4207 D XmlParser: name---: age
11-29 07:43:03.839 4207 4207 D XmlParser: name---: love
11-29 07:43:03.839 4207 4207 D XmlParser: name---: sports
11-29 07:43:03.839 4207 4207 D XmlParser: name---: sportlist
11-29 07:43:03.839 4207 4207 D XmlParser: name---: sportlist
11-29 07:43:03.839 4207 4207 D XmlParser: name---: sex
11-29 07:43:03.839 4207 4207 D XmlParser: name---: age
11-29 07:43:03.839 4207 4207 D XmlParser: name---: love
11-29 07:43:03.839 4207 4207 D XmlParser: xml list: Student{name='zhang san', sex='boy', age='18', love='music world', sportlist=[ball, swimming, song]}
11-29 07:43:03.840 4207 4207 D XmlParser: xml list: Student{name='zhang 1', sex='girl', age='20', love='vidio world', sportlist=[11, 22, 33]}