Android 操作XML的几种方式

最近在学习Android的开发知识。今天在看传智博客黎老师的视频刚好看到了关于xml文件操作的知识,自己在之前的学习使用中基本都是使用DOM的方式操作XML的文件,今天知道了其他的方式总结记录下来方便后面自己使用。

Android里面操作xml文件主要有三种方式:

SAX方式,DOM方式,PULL方式。据说因为DOM的方式比较耗内存,而手机最纠结的就是存储空间小的问题,所以在Android里面不提倡使用DOM的方式。而SAX方式和PULL方式的思想比较的相似,原理似乎是同出一则的,实现的思想好像是读取字符串的每一个单词一样,每读取一段就判断读取的是什么内容然后执行相应的方法,直至文件的结尾。

xml文件内容:

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

<person id="23">
<name>limei</name>
<age>20</age>
</person>

</persons>

下面是三种方式读取xml文件内容的方式:

SAX实现xml文件内容的读取:

View Code
package cn.edu.gxnu.Service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import cn.edu.gxnu.Domian.Person;

public class SAXPersonService {

/**
* SAX方式获取XML文件的内容
*
@param inStream
*
@return
*
@throws Throwable
*/
public List<Person> getPersons(InputStream inStream) throws Throwable{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
PersonParser personparser = new PersonParser();
parser.parse(inStream, personparser);
inStream.close();
return personparser.getPersons();
}

/**
*
*
@author wmh
*
*/
private final class PersonParser extends DefaultHandler {

private List<Person> persons = null;
private Person person = null;
private String tag = null;

public List<Person> getPersons() {
return persons;
}

/**
* 读取XML至文件开始时方法
*/
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
}

/**
* 读取XML的元素节点的方法
*/
@Override
public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
if("person".equals(localName)){
person = new Person();
person.setId(new Integer(attributes.getValue(0)));
}
tag = localName;
}

/**
* 读取XML的文本内容时的方法
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(tag != null){
String data = new String(ch , start , length);
if("name".equals(tag)){
person.setName(data);
}else if("age".equals(tag)) {
person.setAge(new Short(data));
}
}
}

/**
* 读取到元素节点结束时的方法
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {

if("person".equals(localName)){
persons.add(person);
person = null;
}

tag = null;
}

}

}

DOM实现xml文件内容的读取:

View Code
package cn.edu.gxnu.Service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import cn.edu.gxnu.Domian.Person;

public class DOMPersonService {

/**
* 使用DOM获取XML文件的内容
*
@param inStream
*
@return
*
@throws Throwable
*/
public List<Person> getPersons(InputStream inStream) throws Throwable{
List<Person> persons = new ArrayList<Person>();
//DOM文件创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//DOM创建对象
DocumentBuilder builder = factory.newDocumentBuilder();
//获取XML的DOM
Document document = builder.parse(inStream);
//获取XML文件的内容
Element root = document.getDocumentElement();
//获取XML文件的节点
NodeList personNode = root.getElementsByTagName("person");
for(int i = 0 ; i < personNode.getLength() ; i++){
Person person = new Person();
Element personElemt = (Element)personNode.item(i);
person.setId(new Integer(personElemt.getAttribute("id")));
//获取当前节点的字节点
NodeList personChildNode = personElemt.getChildNodes();
for(int y = 0 ; y < personChildNode.getLength() ; y++){
if(personChildNode.item(y).getNodeType() == Node.ELEMENT_NODE){
Element childElent = (Element)personChildNode.item(y);
if("name".equals(childElent.getNodeName())){
person.setName(childElent.getFirstChild().getNodeValue());
}else if("age".equals(childElent.getNodeName())){
person.setAge(new Short(childElent.getFirstChild().getNodeValue()));
}
}
}
persons.add(person);
}
return persons;
}

}

PULL实现xml文件内容的读取:

View Code
package cn.edu.gxnu.Service;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;

import cn.edu.gxnu.Domian.Person;

public class PULLPersonService {

/**
* PULL方式获取XML文件内容
*
@param inStream
*
@return
*
@throws Throwable
*/
public List<Person> getPersons(InputStream inStream) throws Throwable{
List<Person> persons = null;
Person person = null;
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inStream, "UTF-8");
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){//判断文件是否是文件的结尾,END_DOCUMENT文件结尾常量
switch(eventType){
case XmlPullParser.START_DOCUMENT://文件开始,START_DOCUMENT文件开始开始常量
persons = new ArrayList<Person>();
break;

case XmlPullParser.START_TAG://元素标签开始,START_TAG标签开始常量
String name = parser.getName();
if("person".equals(name)){
person = new Person();
person.setId(new Integer(parser.getAttributeValue(0)));
}

if(person != null){
if("name".equals(name)){
person.setName(parser.nextText());
}
if("age".equals(name)){
person.setAge(new Short(parser.nextText()));
}
}
break;

case XmlPullParser.END_TAG://元素标签结束,END_TAG结束常量
if("person".equals(parser.getName())){
persons.add(person);
person = null;
}
break;
}
//获取当前元素标签的类型
eventType = parser.getEventType();
}
return persons;
}
}

而构造XML的方式页比较好理解,PULL的方式提供了构造文件,节点开始和结束的方法,只需要调用特定的方法传入特定的内容即可完成XML文件的构造

View Code
package cn.edu.gxnu.Service;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;

import cn.edu.gxnu.Domian.Person;

public class PULLPersonService {

/**
* OputStram方式生成XML文件
*
@param persons
*
@param outStream
*
@throws Throwable
*/
public static void save(List<Person> persons , OutputStream outStream) throws Throwable{
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(outStream, "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();
outStream.flush();
outStream.close();
}
}

这样,就可以构造一个XML文件了,每个节点都是一对一对的出现的。

posted @ 2012-01-08 22:19  精灵化石  阅读(5755)  评论(0编辑  收藏  举报