Android pull方式解析XML文件

本文详细介绍了如何使用Pull方式解析XML文件,并针对特定XML源文件进行了解析示例。重点讨论了如何处理包含List类型的节点数据及在Android系统中应用此解析方法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人认为DOM, SAX, PULL3种解析XML的方式中Pull是最适合在android系统中使用的,轻便,灵活,占用资源较少


废话不说,先把xml源文件描述如下:


<?xml version="1.0" encoding="utf-8"?>
<root>
	<anim>
		<switcher>yes</switcher>
	</anim>
	<serial>
		<com>
			<identifier>com0</identifier>
			<tty>s3c_serial0</tty>
			<bandrate>115200</bandrate>
			<charlength>15</charlength>
			<timeout>2</timeout>
		</com>
		<com>
			<identifier>com1</identifier>
			<tty>s3c_serial1</tty>
			<bandrate>115200</bandrate>
			<charlength>15</charlength>
			<timeout>2</timeout>
		</com>
	</serial>
	<server>
		<ip>10.14.11.12</ip>
		<port>8080</port>
	</server>
</root>



这个xml文件包含了单独的节点,也包含了含有List类型的节点数据,解析的时候需要特别注意一下

我在解析的时候用了一个标示代表是不是需要对List类型进行解析,如果是标示为true,不是的话为false,跳过List解析


在XmlPullParser.END_TAG处理时,把需要保存的数据保存下来

解析的时候我定义了两个javabean保存数据,一个是InspurConfigBean,包含List和一些简单类型数据;SerialPortBean是List的数据成员;

下面是解析源码(为了更容易看出解析思路,许多没有用到的节点也参与到了解析过程中,实际上可以去掉)


package com.example.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

public class ConfigXMLParser {
	
	private InspurConfigBean inspurConfigBean;
	private ArrayList<SerialPortBean> serialList;
	private SerialPortBean serialPortBean;
	private InputStream is;
	private boolean isNormal = true;
	private boolean startSerialElement = false;
	
	public ConfigXMLParser(String xmlPath)
	{
		File file = new File(xmlPath);
		if (!file.exists())
		{
			
			inspurConfigBean = null;
			isNormal = false;
		}else{
			try {
				is = new FileInputStream(file);
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				inspurConfigBean = null;
			}
		}
	}
	
	public void parse() throws XmlPullParserException, IOException {
		if (!isNormal)
		{
			inspurConfigBean = null;
			return;
		}
		XmlPullParserFactory factory = null;
		XmlPullParser parser = null;
		factory = XmlPullParserFactory.newInstance();
		parser = factory.newPullParser();
		parser.setInput(is, "UTF-8");
		int eventType = parser.getEventType();
		String qName = "";
		while(eventType != XmlPullParser.END_DOCUMENT)
		{
			switch(eventType)
			{
				case XmlPullParser.START_DOCUMENT:
					inspurConfigBean = new InspurConfigBean();
					break;
				case XmlPullParser.START_TAG:
					qName = parser.getName();
					if (qName.equalsIgnoreCase("root"))
					{
					}else if (qName.equalsIgnoreCase("anim"))
					{
					}else if (qName.equalsIgnoreCase("switcher"))
					{
						if (parser.nextText().equalsIgnoreCase("yes"))
						{
							inspurConfigBean.setSwitcher(true);
						}else
						{
							inspurConfigBean.setSwitcher(false);
						}
					}else if (qName.equalsIgnoreCase("server"))
					{
					}else if (qName.equalsIgnoreCase("ip"))
					{
						inspurConfigBean.setServer_ip(parser.nextText().toString().trim());
					}else if (qName.equalsIgnoreCase("port"))
					{
						inspurConfigBean.setServer_port(parser.nextText().toString().trim());
					}
					else if (qName.equalsIgnoreCase("serial"))
					{
						serialList = new ArrayList<SerialPortBean>();
						startSerialElement = true;
					}
					if (startSerialElement)
					{
						if (qName.equalsIgnoreCase("com"))
						{
							serialPortBean = new SerialPortBean();
						}else if (qName.equalsIgnoreCase("identifier"))
						{
							serialPortBean.setIdentifier(parser.nextText().toString().trim());
						}else if (qName.equalsIgnoreCase("tty"))
						{
							serialPortBean.setTty(parser.nextText().toString().trim());
						}else if (qName.equalsIgnoreCase("bandrate"))
						{
							serialPortBean.setBandrate(Integer.parseInt(parser.nextText()));
						}else if (qName.equalsIgnoreCase("charlength"))
						{
							serialPortBean.setCharLength(Integer.parseInt(parser.nextText()));
						}else if (qName.equalsIgnoreCase("timeout"))
						{
							serialPortBean.setTimeout(Integer.parseInt(parser.nextText()));
						}
					}
					break;
				case XmlPullParser.END_TAG:
					qName = parser.getName();
					if (qName.equalsIgnoreCase("com"))
					{
						serialList.add(serialPortBean);
					}else if (qName.equalsIgnoreCase("serial"))
					{
						inspurConfigBean.setSerialList(serialList);
					}
					break;
			}
			eventType = parser.next();
		}
	}
	
	public InspurConfigBean getResult(){
		return inspurConfigBean;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值