Xml解析方式之Pull解析器的使用

作者:网络    软件教程库   2020-05-20

xml有多种解析的方式,这篇文章只介绍用pull解析器来解析xml文件,接下来我会说明使用pull解析器来读取xml文件内容和新建xml文件。

  1. 读取xml文件的内容
    我在项目中已经添加了一个xml文件,“data.xml”,下面是xml文件里面的内容。
    xml version=1.0 encoding = utf-8
    persons
        person id = 23
            namejack/name
            age18/age
        /person
        person id = 20
            nametom/name
            age21/age
        /person
    /persons
    为了方便操作,我新建了一个person类:

    public class person {
    	private int id;
    	private string name;
    	private int age;
    	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 int getage() {
    		return age;
    	}
    	public void setage(int age) {
    		this.age = age;
    	}
    	@override
    	public string tostring() {
    		return person [id= + id + , name= + name + , age= + age + ];
    	}
    	public person(int id, string name, int age) {
    		super();
    		this.id = id;
    		this.name = name;
    		this.age = age;
    	}
    	public person() {
    		
    	}
    }

    然后我又建了一个personservice类,在这个类里面实现我们的操作。
    public class personservice {
    	/**
    	 * 获取xml文件的内容
    	 * @param p_inputstream	xml文件输入流
    	 * @return	包含person信息的列表
    	 * @throws exception
    	 */
    	public static listperson getpersons(inputstream p_inputstream) throws exception{
    		listperson persons = null;
    		person person = null;
    		//得到xmlpullparse对象
    		xmlpullparser pullparser = xml.newpullparser();
    		pullparser.setinput(p_inputstream, utf-8);
    		int event = pullparser.geteventtype();
    		while(event != xmlpullparser.end_document){
    			switch (event) {
    				case xmlpullparser.start_document:
    					persons = new arraylistperson();
    					break;
    				case xmlpullparser.start_tag:
    					if(person.equals(pullparser.getname())){
    						person = new person();
    						int id = new integer(pullparser.getattributevalue(0));
    						person.setid(id);
    					}
    					if(name.equals(pullparser.getname())){
    						string name = pullparser.nexttext();
    						person.setname(name);
    					}
    					if(age.equals(pullparser.getname())){
    						int age = new integer(pullparser.nexttext());
    						person.setage(age);
    					}
    					break;
    				case xmlpullparser.end_tag :
    					if(person.equals(pullparser.getname())){
    						persons.add(person);
    						person = null;
    					}
    					break;
    			}
    			event = pullparser.next();
    		}
    		return persons;
    	}
    	/**
    	 * 保存数据到xml文件中
    	 * @param p_person		 数据列表
    	 * @param p_out			输出流
    	 * @throws exception	抛出异常
    	 */
    	public static void save(listperson p_person,outputstream p_out) throws exception{
    		xmlserializer serializer = xml.newserializer();
    		serializer.setoutput(p_out, utf-8);
    		serializer.startdocument(utf-8, true);
    		serializer.starttag(null, persons);
    		for(person person:p_person){
    			serializer.starttag(null, person);
    			serializer.attribute(null, id, person.getid()+);
    			
    			serializer.starttag(null, name);
    			serializer.text(person.getname());
    			serializer.endtag(null, name);
    			
    			serializer.starttag(null, age);
    			serializer.text(person.getage()+);
    			serializer.endtag(null, age);
    			
    			serializer.endtag(null, person);
    		}
    		serializer.endtag(null, persons);
    		serializer.enddocument();
    		
    		p_out.flush();
    		p_out.close();	
    	}
    		
    }

    在这个类里面,我共定义了两个静态方法,一个用来读取xml文件的内容,然后把信息放到一个列表中,另一个用来生成xml文件,保存到手机中。
    读取xml的时候,我们需要先得到xmlpullparser的对象,利用xml类的一个静态方法来得到:xml.newpullparser(),然后我们把xml文件输入流和xmlpullparse对象进行设置或者说是连接:pullparser.setinput(p_inputstream, utf-8),然后就开始解析xml文件了。
    解析的时候是逐行开始解析的,int event = pullparser.geteventtype(),这行代码开始可能不理解,比方说,此时解析器解析的内容是person id = 23,那么此时event的#20540;就是xmlpullparser.start_tag,代表着开始标签,在代码中还有其他的一些#20540;,end_tag--结束标签等等。根据event的#20540;,我们就可以知道解析器当前的解析内容是哪一行,然后进行相关的操作。

  2. 新建xml文件,然后保存到手机上
新建xml文件的时候,同样要使用封装类,xmlserializer serializer = xml.newserializer(),这样,我们对xmlserializer的对象进行操作,然后就可以把信息保存到手机上了。

下面是我mainactivity中的代码:

public class mainactivity extends activity {
	private textview text;
	stringbuilder sb;
	@override
	protected void oncreate(bundle savedinstancestate) {
		super.oncreate(savedinstancestate);
		setcontentview(r.layout.activity_main);
		text = (textview) findviewbyid(r.id.text);
		sb = new stringbuilder();
		sb.append(源文件的内容\n);
		inputstream xml = getclass().getclassloader().getresourceasstream(data.xml);
		try {
			listperson persons = personservice.getpersons(xml);
			for(person person:persons)
				sb.append(person.tostring()).append(\n);
			text.settext(sb);
		} catch (exception e) {}
		sb.append(新建的文件的内容\n);
		listperson p = new arraylistperson();
		p.add(new person(13, lili, 18));
		p.add(new person(23, liufi, 45));
		file xmlfile = new file(getapplicationcontext().getfilesdir(),person.xml);
		try {
			outputstream outputstream  = new fileoutputstream(xmlfile);
			personservice.save(p, outputstream);
		} catch (exception e) {}
		try {
			xml = new fileinputstream(getapplicationcontext().getfilesdir()+/person.xml);
			listperson persons = personservice.getpersons(xml);
			for(int i=0;ipersons.size();i++)
				sb.append(persons.get(i).tostring()).append(\n);
			text.settext(sb);
		} catch (exception e1) {}
	}
}
写的内容不多,代码倒是挺多的,因为内容比较基础,所以看看代码就可以明白解析的方式,多用用就可以很快的掌握了pull解析器了。

xml解析方式之pull解析器的使用

原文地址:http://blog.csdn.net/programchangesworld/article/details/45422577

软件教程库 原文地址:https://www.itjcku.com/9999/1091528.html

阅读全部内容


Tags:解析方式使用

返回首页



推荐内容

enum,EnumMap,EnumSet

enum基本使用 : package com.enumtest; enum shrubbery { gr ...

Hibernate乱码问题解决

乱码问题其实归根接地就是两端的字符集不统一。 解决思路也有两种: 1. 修改两端字符集统一。 2. 通过代码进行转 ...

eclipse集成struts2.3.20

需要强调的是,这里介绍的是在eclipse工具下集成struts2.3.20而不是myeclipse添加对struts2 ...

ubi文件系统制作,还是"-c"选项的问题

以下是分析记录: --------------------------------------------------- ...

如何把事情做到最好读书笔记1

开篇语: 每个人生来都具备足够的潜力,每个人都能做到别人#30524;中难以企及的事情。请永远保持初学之心,勇敢面对 ...

如何把事情做到最好读书笔记2

第二章 认清自己:你属于哪种类型的人 你必须足够了解你自己,下面有三种类型的人、 (1)浅尝辄止者 浅尝辄止者对一切 ...

如何把事情做到最好读书笔记3

第三章 一份耕耘才能一份收获 当你决定踏上精益求精之路时,你会突然发现周围的一切都与你所追求的#26684;#2668 ...

如何把事情做到最好读书笔记4

第四章 热爱平台期 从小,我们接受的教育就是好好学习,这样才能上好的大学,上好的大学才能找到好工作,有好工作才能有钱买 ...

习题10-21二项式系数UVa1649

1.题目描述:点击打开链接 2.解题思路:本题利用枚举#43;二分解决。问题的关键是选对枚举对象,因为要找c(n,k)= ...

mysql小技巧

selectnow(),user(),version(),database(); #最后输入\c是放弃的意思 des ...

Java学习笔记——面试常客:写出一个死锁的例子

现在的面试挺蛋疼,为了考察大家的语言掌握水平,类#20284;这样的题特别多,不过在某个角度来说确实能看出一个人对某个知 ...

UVA-10396VampireNumbers暴力+打表

题目大意:给出n,要求你输出所有符合规则的n位数 规则如下,这个n位数由两个n/2位数相乘得到,并且满足 1.这n位 ...

CF148D.Bagofmice[概率dp]

题目链接:http://codeforces.com/problemset/problem/148/d 题目大意:一袋子 ...

HDU-1846-BraveGame(巴什博弈)

题目传送:brave game 介绍: 巴什博奕(bash game): 首先我们来玩一个比较古老的报数游戏。a ...

HDU-2149-PublicSale(巴什博弈)

题目传送:public sale 思路:巴什博弈 ac代码: #include lt;cstdiogt; # ...

enum实现售卖机

首先 推荐一下google的代码风格 :https://google-styleguide.googlecode ...

批量添加用户

a、创建用户文件,因为添加的用户比较多,因此编写脚本创建一个用户文件user.txt #!/bin/ba ...

解决侧滑中ViewPager和SlidingMenu的滑动冲突

当我们在使用开源框架slidingmenu时,如果要是使用到viewpager,就会出现滑动冲突。 解决方案: }/** ...

shell打乱文件行

思路,产生一个随机数组,然后按按照数组的元素将文件中行的重新输出 1、随机数组的生成 看书的时候感觉很是简单。第 ...

编程之美2015初赛第二场AB

题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256mb 描述 一副不含王的扑 ...

Java设计模式之单例模式(恶汉式和懒汉式)

/* * 单例模式: * 饿汉式:类一加载就创建对象 * 懒汉式:用的时候,才去创建对象 * 面试题:单例模式的 ...

Html简单介绍

1、html--- hypertext markup language 的缩写 --- 超文本 标记 语言. 这个技 ...

configure:error:youmustconfigureinaseparatebuilddirectory

configure glibc-2.14 时出现以下错误: [[email#160;protected] opt]# ...

kohana框架生成feed

创建feed feed::create()斱法用给定癿参数杢创建 rss戒者 atom feed。下面是可接叐癿参数。 ...

用USB安装linux

手边没有光驱,安装ubuntu可以用 linuxlive usb creator 2.9.3,在百度网盘里有的。http ...

一个复杂子查询SQL优化

select * from test.vmark vk where id in (select v.id ...

Java多线程中常见的几个问题

我们都知道,在java中要想实现多线程,有两种手段,一种是继续thread类,另外一种是实现runable接口。  1. ...

OracleDataIntegrator12c-CreatingaCollocatedAgent

http://www.oracle.com/webfolder/technetwork/tutorials/obe/fm ...

CompilingGCC5onOSX

compiling gcc 5 on os x */--> pre.src {backgro ...

查看Linux上MySQL版本信息

如果mysql是用rpm或者yum安装的,可用 #rpm -qa|grep mysql查看. 如: [[email#16 ...


本网站部分内容来自互联网,版权归原作者所有,文章内容仅代表原作者个人观点。如有侵权请联系我们删除 电子邮件 itjcku@foxmail.com