部分代码和结果展示:
原xml文件如下:
<smss>
<sms id="1">
<name>测试0</name>
<age>0</age>
<xbie>男</xbie>
</sms>
<sms id="2">
<name>测试1</name>
<age>1</age>
<xbie>男</xbie>
</sms>
<sms id="3">
<name>测试2</name>
<age>2</age>
<xbie>男</xbie>
</sms>
<sms id="4">
<name>测试3</name>
<age>3</age>
<xbie>男</xbie>
</sms>
<sms id="5">
<name>测试4</name>
<age>4</age>
<xbie>男</xbie>
</sms>
<sms id="6">
<name>测试5</name>
<age>5</age>
<xbie>男</xbie>
</sms>
<sms id="7">
<name>测试6</name>
<age>6</age>
<xbie>男</xbie>
</sms>
<sms id="8">
<name>测试7</name>
<age>7</age>
<xbie>男</xbie>
</sms>
<sms id="9">
<name>测试8</name>
<age>8</age>
<xbie>男</xbie>
</sms>
<sms id="10">
<name>测试9</name>
<age>9</age>
<xbie>男</xbie>
</sms>
</smss>
解析代码如下:
package com.example.xml;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.app.Activity;
import android.os.Bundle;
import android.util.Xml;
import android.view.View;
import android.widget.TextView;
/**
* @author:unjjfly
* @version jdk1.8 创建时间:2019年2月11日上午11:28:56 类说明
*/
public class ParsexmlActivity extends Activity {
private List<Sms> list;
private Sms sms;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.show_xml);
// [1]创建一个XmlPullParser解析器
XmlPullParser xpp = Xml.newPullParser();
try {
// [2]设置解析器的输入源
InputStream is = getAssets().open("smsbackup1.xml");
xpp.setInput(is, "utf-8");
// 创建一个事件类型
int eventType = xpp.getEventType();
// 判断开始标识
while (eventType != XmlPullParser.END_DOCUMENT) {
sms = new Sms();
switch (eventType) {
// 判断开始标识
case XmlPullParser.START_TAG:
if ("smss".equals(xpp.getName())) {
list = new ArrayList<Sms>();
} else if ("sms".equals(xpp.getName())) {
sms.setId(Integer.parseInt(xpp.getAttributeValue(0)));
} else if ("name".equals(xpp.getName())) {
sms.setName(xpp.nextText());
} else if ("age".equals(xpp.getName())) {
sms.setAge(Integer.parseInt(xpp.nextText()));
} else if ("xbie".equals(xpp.getName())) {
sms.setXbei(xpp.nextText());
}
break;
// 判断结束标识
case XmlPullParser.END_TAG:
// 判断结束标识
if ("sms".equals(xpp.getName())) {
// 把数据存入集合中
list.add(sms);
}
break;
}
// 解析下一个标签
eventType = xpp.next();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 获取tv控件。
tv = findViewById(R.id.tv_show_xml);
// 将集合中的数据显示到tv控件上。
// 创建一个缓冲区
StringBuffer sb = new StringBuffer();
for (Sms sms : list) {
sb.append(sms.toString());
sb.append("\n");
}
tv.setText(sb.toString());
}
public void click(View v) {
finish();
}
}
结果如图:
将sms = new Sms();放到switch里面代码如下:
package com.example.xml;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.app.Activity;
import android.os.Bundle;
import android.util.Xml;
import android.view.View;
import android.widget.TextView;
/**
* @author:unjjfly
* @version jdk1.8 创建时间:2019年2月11日上午11:28:56 类说明
*/
public class ParsexmlActivity extends Activity {
private List<Sms> list;
private Sms sms;
private TextView tv;
/**
* @see android.app.Activity#onCreate(android.os.Bundle)
* @Function: Parsexml.java
* @Description: 该函数的功能描述
*
* @param:描述1描述
* @return:返回结果描述
* @throws:异常描述
*
* @version: 版本
* @author: zhaohaifu
* @date: 2019年2月11日 上午11:33:11
*
* Modification History: Date Author Version Description
* ---------------------------------------------------------* 2019年2月11日
* zhaohaifu v1.0.0 修改原因
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.show_xml);
// [1]创建一个XmlPullParser解析器
XmlPullParser xpp = Xml.newPullParser();
try {
// [2]设置解析器的输入源
InputStream is = getAssets().open("smsbackup1.xml");
xpp.setInput(is, "utf-8");
// 创建一个事件类型
int eventType = xpp.getEventType();
// 判断开始标识
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
// 判断开始标识
case XmlPullParser.START_TAG:
if ("smss".equals(xpp.getName())) {
list = new ArrayList<Sms>();
} else if ("sms".equals(xpp.getName())) {
sms = new Sms();
sms.setId(Integer.parseInt(xpp.getAttributeValue(0)));
} else if ("name".equals(xpp.getName())) {
sms.setName(xpp.nextText());
} else if ("age".equals(xpp.getName())) {
sms.setAge(Integer.parseInt(xpp.nextText()));
} else if ("xbie".equals(xpp.getName())) {
sms.setXbei(xpp.nextText());
}
break;
// 判断结束标识
case XmlPullParser.END_TAG:
// 判断结束标识
if ("sms".equals(xpp.getName())) {
// 把数据存入集合中
list.add(sms);
}
break;
}
// 解析下一个标签
eventType = xpp.next();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 获取tv控件。
tv = findViewById(R.id.tv_show_xml);
// 将集合中的数据显示到tv控件上。
// 创建一个缓冲区
StringBuffer sb = new StringBuffer();
for (Sms sms : list) {
sb.append(sms.toString());
sb.append("\n");
}
tv.setText(sb.toString());
}
public void click(View v) {
finish();
}
}
结果如图:
sms 类在switch 外面构造就会出问题,只有在switch里构造才不会出问题,这里没搞懂。