Android中解析Xml文件并显示到文本框

1、首先,我将一个Message.xml文件复制粘贴到eclipse的asserts文件夹`

<?xml version="1.0" encoding="utf-8"?>
<root>
  <msg id="1">
    <address>10080</address>
    <body>abb0</body>
    <date>20180</date>
  </msg>
  <msg id="2">
    <address>10081</address>
    <body>abb1</body>
    <date>20181</date>
  </msg>
  <msg id="3">
    <address>10082</address>
    <body>abb2</body>
    <date>20182</date>
</msg>
</root>

2、然后写了一个Message类

public class Message {
	private String address;
	private String body;
	private String date;
	private String id;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getBody() {
		return body;
	}
	public void setBody(String body) {
		this.body = body;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	@Override
	public String toString() {
		return "Message [address=" + address + ", body=" + body + ", date="
				+ date + ", id=" + id + "]";
	}
}

3、再写一个用于解析xml的工具类MessageRelease(最易出错),容易出错的地方我都标注在代码中

public class MessageRelease {
	/*
	 * 服务器端以流的形式把数据返回的
	 */
	public static List<Message> releasexml(InputStream in) throws Exception {
		//【0】声明集合对象和类对象
		List<Message> msgList = null;
		Message msg = null;
		/*
		 * 一行一行的进行解析 【1】获取XmlPullParser解析的实例
		 */
		XmlPullParser parser = Xml.newPullParser();
		// 【2】设置XmlPullParser的参数
		parser.setInput(in, "utf-8");
		// 【3】获取事件类型
		//int type = parser.getEventType();这行代码在其他很多人的代码中都有,但是这里其实将type写死了(即type是一个常量),导致在后面的循环当中无限循环
		//在这个while循环中,将数据封装成Message的对象存到集合msgList当中
		//while (type !=XmlPullParser.END_DOCUMENT) {
		while (parser.getEventType()!=XmlPullParser.END_DOCUMENT) {
			//xml可能因为格式不规范出现parser读一行为null的情况
			if(parser.getName()!=null) {
			//Log.i("tag", "22222"+parser.getName()+parser.getEventType());
			switch (parser.getEventType()) {
			case XmlPullParser.START_TAG:// 解析开始标签
            // 【4】具体判断解析到了哪个结点
				if("root".equals(parser.getName())){
					//【5】创建一个集合对象
					Log.i("tag", "<root>");
					msgList = new ArrayList<Message>();
				}else if ("msg".equals(parser.getName())) {
					 //【6】创建Message对象
					Log.i("tag", "<msg>");
					msg = new Message();
					//【7】获取id值
					String id = parser.getAttributeValue(0);
					msg.setId(id);
				}else if ("address".equals(parser.getName())) {					 
					//【8】获取adress的数据
					Log.i("tag", "<address>");
					String address = parser.nextText();
					msg.setAddress(address);
				}else if ("body".equals(parser.getName())) {					 
					//【8】获取body的数据
					Log.i("tag", "<body>");
					String body = parser.nextText();
					msg.setBody(body);
				}else if ("date".equals(parser.getName())) {					 
					//【8】获取date的数据
					Log.i("tag", "<date>");
					String date = parser.nextText();
					msg.setDate(date);
				}				
				break;
			case XmlPullParser.END_TAG:// 解析结束标签
                 //具体判断要解析的结束标签
				if("msg".equals(parser.getName())){
					//把javabean对象放入集合当中
					msgList.add(msg);
					msg=null;
					Log.i("tag", "************");					
				}
				break;
			}					
		}
		// 不停地向下解析
		parser.next();
		}
		return msgList;
	}
}

4、最后,在MainActivity当中调用工具类的方法

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取文本框
        TextView tv = (TextView) findViewById(R.id.tv);       
        try {
			//通过上下文,获取资产的管理者        
			InputStream in = getAssets().open("Message.xml");
			//【2】调用定义的xml业务方法		
			List<Message> msList = MessageRelease.releasexml(in);		
		    StringBuffer sb = new StringBuffer();
			for(Message msg:msList){
		    	sb.append(msg.toString());		    	
		    }		
			tv.setText(sb.toString());
        } catch (Exception e) {		
			e.printStackTrace();
		}
    }  
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值