第一次学习xml文件的解析,由于pull技术解析方式比较好用,代码量相对简洁,挑了pull进行学习。
刚开始接触的时候会想:xml文件是做什么用的? 为什么要解析xml文件?
xml在各种开发中都广泛用到,是作为承载数据的一个角色
1、因为我们经常要到网上去获取数据,例如天气预报,数据是以xml文件的格式存在的,所以我们要获取里面的数据,就必须对xml文件进行解析。
2、还有一个作用就是保存你的数据,保存为xml文件的格式,然后要用到的时候再通过程序解析读取调用。
那么解析方法有哪几种呢?
SAX解析器、DOM解析器、PULL解析器、Android.util.Xml类解析方法
区别:
1、DOM在处理XML文件时,将XML文件解析成树状结构并放入内存中进行处理。当xml文件较小时,我们可以选DOM,因为它简单、直观,不过当xml文件过大,或者设备内存空间过小时,不建议使用DOM。
2、SAX则是以事件作为解析XML文件的模式,它将XML文件转化成一系列的事件,由不同的事件处理器决定如何处理。XML文件较大时,选择SAX技术是比较合理的。虽然代码量有些大,但它不需要将所有的XML文件加载到内存中。这样对于有限的Android内存更有效,而且Android提供了一种传统的SAX使用方法以及一个便捷的SAX包装器。
3、PULL解析并未像SAX解析那样监听元素的结束,而是在开始出完成大部分处理。这样有利于提早读取XML文件,可以极大的减少解析时间,这种优化对于连接数据较慢的移动设备尤为重要。对于XML文档较大但只需要文档的一部分时,XML Pull解析器则更为有效的方法
下面是代码实例:
book.xml(要进行解析的文件)
<? xml version= "1.0" encoding = "utf-8"?>
< books>
<book >
< id> 1001</ id >
< name> Thinking In Java </name >
< price> 80.00</ price >
</book >
<book >
< id> 1002</ id >
< name> Core Java </name >
< price> 90.00</ price >
</book >
<book >
< id> 1003</ id >
< name> Hello, Andriod </name >
< price> 100.00</ price >
</book >
</books>
Book.java(Book实体类)
package com.examle.model;
public class Book {
private String name;
private int id ;
private float price ;
public String getName() {
return name ;
}
public void setName(String name) {
this .name = name;
}
public int getId() {
return id ;
}
public void setId(int id) {
this .id = id;
}
public float getPrice() {
return price ;
}
public void setPrice( float price) {
this .price = price;
}
public String toString(){
return "id:" + id+ ",name:" +name + ",price:"+ price ;
}
}
BookParser.java(定义接口)
定义两个方法
1、解析输入流(xml文件),得到Book对象集合
2、序列化Book对象集合,得到xml形式的字符串(将获取到的数据以xml形式存入本地内存中)
package com.example.parser;
import java.io.InputStream;
import java.util.List;
import com.examle.model.Book;
/**
*
* @author hasee
*
*/
public interface BookParser {
/**
* 解析输入流 得到Book对象集合。
* @param is
* @return
* @throws Exception
*/
public List<Book> parse(InputStream is) throws Exception;
/**
* 序列化Book对象集合 得到XML形式的字符串
* @param books
* @return
* @throws Exception
*/
public String serialize(List<Book> books) throws Exception;
}
PullBookParser.java(实现接口)
package com.example.parser;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import android.util.Xml;
import com.examle.model.Book;
public class PullBookParser implements BookParser{
@Override
public List<Book> parse(InputStream is) throws Exception {
List<Book> books=null;
Book book=null;
XmlPullParser parser=Xml.newPullParser();//有android.util.xml创建一个XmlPullParser实例
parser.setInput(is,"UTF-8");//设置输入流 并指明编码方式
int eventType=parser.getEventType();
while(eventType!=XmlPullParser.END_DOCUMENT){
switch(eventType){
case XmlPullParser.START_DOCUMENT:
books=new ArrayList<Book>();
break;
case XmlPullParser.START_TAG:
if(parser.getName().equals("book")){
book=new Book();
}else if(parser.getName().equals("id")){
eventType=parser.next();
book.setId(Integer.parseInt(parser.getText()));
}else if(parser.getName().equals("name")){
eventType=parser.next();
book.setName(parser.getText());
}else if(parser.getName().equals("price")){
eventType=parser.next();
book.setPrice(Float.parseFloat(parser.getText()));
}
break;
case XmlPullParser.END_TAG:
if(parser.getName().equals("book")){
books.add(book);
book=null;
}
break;
}
eventType=parser.next();
}
return books;
}
@Override
public String serialize(List<Book> books) throws Exception {
XmlSerializer serializer=Xml.newSerializer();
StringWriter writer=new StringWriter();
serializer.setOutput(writer);
serializer.startDocument("UTF-8", true);
serializer.startTag("","books");
for(Book book:books){
serializer.startTag("", "book");
serializer.attribute("", "id", book.getId()+"");
serializer.startTag("", "name");
serializer.text(book.getName());
serializer.endTag("", "name");
serializer.startTag("", "price");
serializer.text(book.getPrice()+"");
serializer.endTag("","price");
serializer.endTag("", "book");
}
serializer.endTag("", "books");
serializer.endDocument();
return writer.toString();
}
}
MainActivity.java(人机交互界面Activity)
package com.example.xml;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.examle.model.Book;
import com.example.parser.BookParser;
import com.example.parser.PullBookParser;
public class MainActivity extends Activity {
private static final String TAG="XML";
private BookParser parser;
private List<Book> books;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button readBtn=(Button)findViewById(R.id.readbtn);
Button writeBtn=(Button)findViewById(R.id.writebtn);
readBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try {
InputStream is=getAssets().open("book.xml");
parser=new PullBookParser();
books=parser.parse(is);
for(Book book:books){
Log.i(TAG,book.toString());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
writeBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try {
String xml=parser.serialize(books);
FileOutputStream fos=openFileOutput("book.xml",Context.MODE_PRIVATE);
fos.write(xml.getBytes("UTF-8"));
} catch (Exception e) {
// TODO Auto-generated catch block
//Log.e(TAG, e.getMessage());
}
}
});
}
}
运行界面
运行结果
点击“read”时,读取book.xml文件中的数据
点击“write”时,将Book对象集合序列化后,返回xml格式的字符串,将字符串转化为xml格式的文件存入到设备内存中。如下图所示:data/data/包名/files/book.xml
这就完整实现了“读取数据”和“保存数据”
pull解析用到的主要的类和接口方法
读取到xml的声明返回 START_DOCUMENT;
读取到xml的结束返回 END_DOCUMENT ;
读取到xml的开始标签返回 START_TAG
读取到xml的结束标签返回 END_TAG
读取到xml的文本返回 TEXT
XmlPullParser:XML pull解析器是一个在XMLPULL VlAP1中提供了定义解析功能的接口。
XmlSerializer:它是一个接口,定义了XML信息集的序列。
XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。
XmlPullParserException:抛出单一的XML pull解析器相关的错误。