PULL解析XML文件

PULL解析XML文件的步骤:

1,  导包
 2,  创建pull解析器工厂
 3,  创建解析器对象
 4,  设置解析的数据源(要解析的内容)
 5,   获取事件的类型(int)  
 6,  循环解析, 直到文档解析完成

解析实例:

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student >
		<id>1</id>
		<name>zhangsan</name>
		<age>20</age>
		<sex>male</sex>
	</student>
	<student >
		<id>2</id>
		<name>lisi</name>
		<age>21</age>
		<sex>female</sex>
	</student>
</students>

Student类:

public class Student {

	private int id;
	private String name;
	private String age;
	private String sex;
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}

}

public static void main(String[] args) throws XmlPullParserException, IOException {
		
		//1, 导包
		//2, 得到Pull解析器工厂
		XmlPullParserFactory  factory = XmlPullParserFactory.newInstance();
		
		//3, 得到Pull解析器
		XmlPullParser parser = factory.newPullParser();
		
		//4, 指定要解析的文件
		parser.setInput(new FileReader("XML文件路径"));
		
		//5, 获取事件的状态类型
		int type = parser.getEventType();
		
		//获取当前解析标签的名称
		String tag = null;
		
		//数据集合
		ArrayList<Student> list = null;
		
		//当前"组装"数据的对象
		Student student = null;
		
		//6, 循环解析, 直到文档结束
		while (type!=XmlPullParser.END_DOCUMENT) {
			
			//获取标签名称
			tag = parser.getName();
			
			switch(type)
			{
			case XmlPullParser.START_DOCUMENT://文档的开始
				
				list = new ArrayList<>();
				
				break;
				
			case XmlPullParser.START_TAG://标签的开始 
				
				if("student".equals(tag))
				{
					student = new Student();
				}
				else if("id".equals(tag))
				{
					String str = parser.nextText();
					
					student.setId(Integer.parseInt(str));
				}else if("name".equals(tag))
				{
					String str = parser.nextText();
					
					student.setName(str);
				}else if("age".equals(tag))
				{
					String str  = parser.nextText();
					
					student.setAge(str);
				}else if("sex".equals(tag))
				{
					String str = parser.nextText();
					
					student.setSex(str);
				}
				
				break;
				
			case XmlPullParser.END_TAG:
				if("student".equals(tag))//</students>
				{
					list.add(student);
				}
				break;
			}
			//获取下一个事件的类型, 不写就死循环了!!  一定要写的
			type = parser.next();
		}
		
		for(Student s:list)
		{
			System.out.println(s);
		}
	}

}

但是XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student id="1">
		<name>zhangsan</name>
		<age>20</age>
		<sex>male</sex>
	</student>
	<student id="2">
		<name>lisi</name>
		<age>21</age>
		<sex>female</sex>
	</student>
</students>

修改为:

public class DemoPull02 {

	/**
	 * @param args
	 * @throws XmlPullParserException 
	 * @throws IOException 
	 */
	public static void main(String[] args) throws XmlPullParserException, IOException {
		// 解析器工厂
		XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
		//解析器
		XmlPullParser parser = factory.newPullParser();
		//设置数据源
		parser.setInput(new FileReader("XML文件路径"));
		//获取事件的类型
		int type = parser.getEventType();
		
		String tag = null;
		ArrayList<Student> list = null;
		Student student = null;
		
		//循环解析, 直到文档结束
		while (type!=XmlPullParser.END_DOCUMENT) {//值为: 1
			
			tag = parser.getName();
			
			switch (type) {
			case XmlPullParser.START_DOCUMENT://值为: 0
				
				list = new ArrayList<>();
				
				break;

			case XmlPullParser.START_TAG://值为: 2
				
				if("student".equals(tag))
				{
					//实例化student
					student = new Student();
					
					//获取属性
					int count  = parser.getAttributeCount();
					
					for(int i=0;i<count;i++)
					{
						String attName = parser.getAttributeName(i);
						
						String attValue = parser.getAttributeValue(i);
						
						if("id".equals(attName))//如果属性名称为id   , 那么需要在student中设置id
						{
							student.setId(Integer.parseInt(attValue));
						}
					}
					
					//如果确定只要一个id
				//	student.setId(Integer.parseInt(parser.getAttributeValue(0)));
					
					
				}else if("name".equals(tag))
				{
					String str = parser.nextText();
					
					student.setName(str);
				}else if("age".equals(tag))
				{
					String str = parser.nextText();
					
					student.setAge(str);
				}else if("sex".equals(tag))
				{
					String str = parser.nextText();
					
					student.setSex(str);
				}
				
				break;
				
			case XmlPullParser.END_TAG://值为: 3
				
				if("student".equals(tag))
				{
					list.add(student);
				}
				
				break;
			}
			
			
			//获取下一个事件, 防止死循环
			type = parser.next();
			
		}
		
		for(Student s:list)
		{
			System.out.println(s);
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值