XmlPullParser xml解析遇到的问题

部分代码和结果展示:

原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里构造才不会出问题,这里没搞懂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值