使用pull解析xml文件

老罗视频学习笔记。


sax和pull是android常用的两种解析xml文件的方式,但是pull更常用,以为代码量小很多。

pull有五个常用的属性:

START_DOCUMENT:文档开始,相当于<persons>

START_TAG:节点开始,相当于<person>

TEXT:

END_TAG:节点结束,相当于</person>

END_DOCUMENT:文档结束,相当于</persons>

要解析的服务器端的xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="23">
		<name>李老师</name>
		<age>23</age>
	</person>
	<person id = "24">
		<name>张老师</name>
		<age>26</age>
	</person>
</persons>

一.客户端。

新建一个java project。

因为pull不是系统自带的,要使用pull解析,需要网上下载第三方pull解析器,本例使用kxml2-2.2.2.jar包

1)新建一个person类,用来存储person属性。

2)新建一个PullXmlParser类,添加parserXML函数,用来解析xml文件,并存入到list中,list中存入的是person类对象。

3)HttpUtils类,使用http的get方式从服务器获取xml的IO流。具体使用上一节sax方式解析xml的httpUtils文件即可。

4)测试类。

person.java内容如下:

public class person {

	public person() {
		// TODO Auto-generated constructor stub
	}
	//成员变量
	private String name = null;
	private int id = 0;
	private int age = 0;
	//有参构造函数
	public person(String name, int id, int age) {
		super();
		this.name = name;
		this.id = id;
		this.age = age;
	}

	//get函数
	public String getName() {
		return name;
	}
	//set函数
	public void setName(String name) {
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	//toString()函数
	@Override
	public String toString() {
		return "person [name=" + name + ", id=" + id + ", age=" + age + "]";
	}
	
	
}

PullXmlParser.java内容如下,pull核心:

public class PullXmlTools {

	public PullXmlTools() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * 想要给函数添加类似于这样的注释,可以在上方输入“/**”,然后点击回车即可
	 * @param inputStream从服务器获取xml,以流的方式返回
	 * @param encode
	 * @return
	 */
	public static List<person> parseXML(InputStream inputStream,String encode){ 
		
		List<person>list = null;
		//装载解析每一个person节点的内容
		person personPerson = null;
		
		//创建一个xml解析的工厂
		try {
			XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
			//获得xml解析类的引用
			XmlPullParser parser = factory.newPullParser();
			parser.setInput(inputStream, encode);
			//获得事件的类型
			int eventType = parser.getEventType();
			//如果当前节点获得的事件类型不是文件结束符时
			//END_DECUMENT类似于</persons>
			while (eventType!=XmlPullParser.END_DOCUMENT) {
				switch (eventType) {
				//相当于<persons>
				case XmlPullParser.START_DOCUMENT:
					list = new ArrayList<person>();
					break;
					//相当于<person>
				case XmlPullParser.START_TAG:
					
					if("person".equals(parser.getName())){
						personPerson = new person();
						//取出属性值
						//getAttributeName(0)意思是第一个属性值
						//System.out.print(parser.getAttributeName(0));这个获取的是"id"
						int id = Integer.parseInt(parser.getAttributeValue(0));
						personPerson.setId(id);
						
					}else if ("name".equals(parser.getName())) {
						String name = parser.nextText();
						personPerson.setName(name);
						
					}else if ("age".equals(parser.getName())) {
						int age = Integer.parseInt(parser.nextText());
						personPerson.setAge(age);
						
					}
					break;
					//相当于</person>
				case XmlPullParser.END_TAG:
					if("person".equals(parser.getName())){
						list.add(personPerson);
						//解析到</person>后,要重新执行下一个<person>,在START_TAG下会重新new一个person对象出来
						personPerson = null;
					}
					
					break;
		
				}
				eventType = parser.next();
			}
			return list;
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
		
		
	}
	
	
}


HttpUtils.java从上一节sax解析xml文件拷贝即可。


test.java文件内容如下:和上一节内容类似:

public static void main(String[] args) {
		
		String pathString = "http://localhost:8080/myhttp/person.xml";
		//从服务器中获取InputStream流
		InputStream  inputStream = HttpUtils.getXML(pathString);
		try {
			//把获取到的inputstream流存入list中
			List<person> list = PullXmlTools.parseXML(inputStream, "utf-8");
			//循环输出
			for(person person : list) {
				System.out.println(person.toString());
			}
		
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

输出结果如下:












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值