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

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

  1. 读取Xml文件的内容

    我在项目中已经添加了一个Xml文件,“data.xml”,下面是Xml文件里面的内容。

    <?xml version="1.0" encoding = "utf-8"?>
    <persons>
        <person id = "23">
            <name>Jack</name>
            <age>18</age>
        </person>
        <person id = "20">
            <name>Tom</name>
            <age>21</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 List<Person> getPersons(InputStream p_InputStream) throws Exception{
    		List<Person> 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 ArrayList<Person>();
    					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(List<Person> 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的值就是XmlPullParser.START_TAG,代表着开始标签,在代码中还有其他的一些值,END_TAG-->结束标签等等。根据event的值,我们就可以知道解析器当前的解析内容是哪一行,然后进行相关的操作。

  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 {
			List<Person> persons = PersonService.getPersons(xml);
			for(Person person:persons)
				sb.append(person.toString()).append("\n");
			text.setText(sb);
		} catch (Exception e) {}
		sb.append("新建的文件的内容\n");
		List<Person> p = new ArrayList<Person>();
		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");
			List<Person> persons = PersonService.getPersons(xml);
			for(int i=0;i<persons.size();i++)
				sb.append(persons.get(i).toString()).append("\n");
			text.setText(sb);
		} catch (Exception e1) {}
	}
}

写的内容不多,代码倒是挺多的,因为内容比较基础,所以看看代码就可以明白解析的方式,多用用就可以很快的掌握了Pull解析器了。

时间: 2024-08-04 18:45:36

Xml解析方式之Pull解析器的使用的相关文章

Android初级教程:Android中解析方式之pull解析

在安卓中有很多种解析方式.按照大方向有xml解析和json解析.而,细致的分,xml和json解析各有自己的很多解析方式.今天这一篇主要介绍xml解析中的pull解析.对于xml的解析方式,我之前在javaweb一些知识中有写过dom和dom4j等等解析方式.有兴趣的读者可以去javaweb篇里面找相关的内容. 先自定义一个数据源,假设就是访问服务器返回的xml数据文件名称为weather.xml: <?xml version='1.0' encoding='utf-8' standalone=

使用XML序列化器生成XML文件和利用pull解析XML文件

首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message> <sms> <body> 陈驰0 </body> <date> 1462162910995 </date> <address> 1380 </address> <type> 1 </type> &

XML文件解析工具类pull解析

public class XMLParser { /** * 解析服务器的配置文件 * @param is 从服务器获得配置的文件的流 */ public static UpdateInfo parser(InputStream is){ UpdateInfo info=null; try { //获得pull解析实例 XmlPullParserFactory factory=XmlPullParserFactory.newInstance(); XmlPullParser xmlParser=

java拾遗3----XML解析(三) StAX PULL解析

使用PULL方式解析XML: Pull是STAX的一个实现 StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程. 为什么说StAX方式的效率优于SAX呢? 因为SAX 是推模式的,所有的操作在解析器自动控制下进行,所有事件都会处理,不管需不需要解析整个文档,解析器都会自动启动解析任务,然后按顺序向下解析,直到解析完成才终

java和android的解析xml的方式

java解析xml经典的有四种方式: 1.dom 2.sax 3.jdom 4.dom4j   个人觉得dom4j好用,但是我只用过jdom. android我知道的用两种方式,sax和pull SAX方式的特点是需要解析完整个文档才会返回,如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式还是会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源. Pull解析器和SAX解析器虽有区别但也有相似性.他们的区别为:SAX解析器的

几种常见的xml解析方式 SAX,DOM,PULL以android为例

准备工作 首先是一个person.xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="18"> <name>allen</name> <age>36</age> </person> <person id="28"> <name>

android解析XML总结-SAX、Pull、Dom三种方式

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8"?> <channel> <item id="0&q

Android DOM、SAX、Pull解析XML(转)

本篇随笔将详细讲解如何在Android当中解析服务器端传过来的XML数据,这里将会介绍解析xml数据格式的三种方式,分别是DOM.SAX以及PULL. 一.DOM解析XML 我们首先来看看DOM(Document Object Model)这种方式解析xml,通过DOM解析xml在j2ee开发中非常的常见,它将整个xml看成是一个树状的结构,在解析的时候,会将整个xml文件加载到我们的内存当中,然后通过DOM提供的API来对我们的xml数据进行解析,这种方式解析xml非常的方便,并且我们可以通过

Android开发之使用PULL解析和生成XML

请尊重他人的劳动成果,转载请注明出处:Android开发之使用PULL解析和生成XML 一.使用PULL解析XML 1.PULL简介 我曾在<浅谈XMl解析的几种方式>一文中介绍了使用DOM方式,SAX方式,Jdom方式,以及dom4j的方式来解析XML.除了可以使用以上方式来解析XML文件外,也可以使用Android系统内置的Pull解析器来解析XML文件. Pull解析器的运行方式与SAX解析器相似.它提供了类似的事件,如开始元素和结束元素事件.使用parser.next()可以进入下一个