• XML解析PULL


    解析xml是很经常使用的操作,除了SAX和DOM两种最经常使用的解析xml外,Pull解析器解析XML文件。 在Android的源代码中大量的使用Pull解析。pull不仅更加的面相对象,并且使用速度和效率更高

    Pull解析器是一个开源的java项目。既能够用于android,也能够用于JavaEE。假设用在javaEE须要把其jar文件放入类路径中。由于Android已经集成进了Pull解析器,所以无需加入不论什么jar文件。android系统本身使用到的各种xml文件,其内部也是採用Pull解析器进行解析的。

    Pull解析器的执行方式与 SAX解析器相似。它提供了类似的事件。如:開始元素和结束元素事件,使用parser.next()能够进入下一个元素并触发对应事件。跟SAX不同的是。Pull解析器产生的事件是一个数字,而非方法。因此能够使用一个switch对感兴趣的事件进行处理。当元素開始解析时,调用parser.nextText()方法能够获取下一个Text类型节点的值。

    以下代码演示怎样使用Pull解析器:

    如有一个person.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <persons>
    	<person id="23">
    		<name>liming</name>
    		<age>30</age>
    	</person>
    	<person id="20">
    		<name>zhangxiaoxiao</name>
    		<age>25</age>
    	</person>
    </persons>

    Person实体:

    package com.andy.domain;
    
    public class Person {
    
    	private Integer id;
    	private String name;
    	private Integer age;
    
    	public Person() {
    
    	}
    
    	public Person(Integer id, String name, Integer age) {
    		super();
    		this.id = id;
    		this.name = name;
    		this.age = age;
    	}
    
    	public Integer getId() {
    		return id;
    	}
    
    	public void setId(Integer id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public Integer getAge() {
    		return age;
    	}
    
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    
    	@Override
    	public String toString() {
    		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    	}
    
    }
    

    完毕读写person.xml的PersonService类

    package com.andy.service;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    import org.xmlpull.v1.XmlSerializer;
    
    import android.util.Xml;
    
    import com.andy.domain.Person;
    
    public class PersonService {
    
    	public static List<Person> getPersons(InputStream xml)
    			throws XmlPullParserException, IOException {
    
    		List<Person> persons = null;
    		Person person = null;
    
    		// XmlPullParser pullParser =
    		// XmlPullParserFactory.newInstance().newPullParser();
    		XmlPullParser pullParser = Xml.newPullParser();
    
    		pullParser.setInput(xml, "UTF-8"); // 为xml设置要解析的xml数据
    
    		int eventType = pullParser.getEventType();
    
    		while (eventType != XmlPullParser.END_DOCUMENT) {
    			switch (eventType) {
    			case XmlPullParser.START_DOCUMENT:
    
    				persons = new ArrayList<Person>();
    				break;
    
    			case XmlPullParser.START_TAG:
    				if ("person".equals(pullParser.getName())) {
    					int id = Integer.valueOf(pullParser.getAttributeValue(0));
    					person = new Person();
    					person.setId(id);
    				}
    
    				if ("name".equals(pullParser.getName())) {
    					String name = pullParser.nextText();
    					person.setName(name);
    
    				}
    
    				if ("age".equals(pullParser.getName())) {
    					int age = Integer.valueOf(pullParser.nextText());
    					person.setAge(age);
    				}
    				break;
    
    			case XmlPullParser.END_TAG:
    				if ("person".equals(pullParser.getName())) {
    					persons.add(person);
    					person = null;
    				}
    				break;
    
    			}
    
    			eventType = pullParser.next();
    
    		}
    
    		return persons;
    	}
    
    	public static void savePerson(List<Person> persons,
    			OutputStream outputStream) throws IllegalArgumentException,
    			IllegalStateException, IOException {
    
    		XmlSerializer serializer = Xml.newSerializer();
    		serializer.setOutput(outputStream, "UTF-8");
    
    		serializer.startDocument("UTF-8", true);
    		serializer.startTag(null, "persons");
    		for (Person person : persons) {
    			serializer.startTag(null, "person");
    			serializer.attribute(null, "id", person.getId().toString());
    			serializer.startTag(null, "name");
    
    			serializer.text(person.getName());
    
    			serializer.endTag(null, "name");
    
    			serializer.startTag(null, "age");
    			serializer.text(person.getAge().toString());
    			serializer.endTag(null, "age");
    
    			serializer.endTag(null, "person");
    		}
    
    		serializer.endTag(null, "persons");
    		serializer.endDocument();
    		
    		outputStream.flush();
    		outputStream.close();
    
    	}
    
    }
    


  • 相关阅读:
    162 基于UDP协议的socket套接字编程
    161 解决粘包问题
    160 粘包问题
    159 模拟ssh远程执行命令
    158 Socket抽象层
    157 基于TCP协议的socket套接字编程
    C++:查找字符串字串并替换
    C++:查找字符串字串并替换
    请问c++中的#include "stdafx.h"是什么意思?
    请问c++中的#include "stdafx.h"是什么意思?
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6875406.html
Copyright © 2020-2023  润新知