解析XML文件:
在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。
SAX解析器:
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
PULL解析器:
在Android平台上可以使用SAX、DOM和Android附带的pull解析器解析XML文件;
pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过switch对感兴趣的事件进行处理;通过paser.nextText()方法可以获取下一个Text类型的节点的值;
读取XML
代码如下 | 复制代码 |
XmlPullParser pullParser = Xml.newPullParser(); pullParser.setInput(xml, "UTF-8");//为破解器添加要解析的XML数据 int event = pullParser.getEventType();//开始读取,获取事件返回值 pullParser.getName();//获取节点名称 pullParser.getAttributeValue(0);//获取第一个属性的值 pullParser.nextText();//获取标签之后的节点的内容 event = pullParser.next(); |
//解析器遇到结束标签不会自动向下解析,需要调用此方法进行继续执行;
保存文件到XML
代码如下 | 复制代码 |
public static void save(List<Person> persons, OutputStream outStream) throws Exception, IllegalStateException, IOException { XmlSerializer serializer = Xml.newSerializer();//获取XML写入信息的序列化对象 serializer.setOutput(outStream, "UTF-8");//设置要写入的OutputStream serializer.startDocument("UTF-8", true);//设置文档标签 serializer.startTag(null, "persons");//设置开始标签,第一个参数为namespace serializer.startTag(null, "name"); serializer.startTag(null, "age"); serializer.endTag(null, "person"); |
解析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> |
然后我们分别使用以上三种解析技术解析文档,得到一个List<Book>的对象,先来看一下Book.java的代码:
代码如下 | 复制代码 |
package com.scott.xml.model; public class Book { public void setId(int id) { public String getName() { public void setName(String name) { public float getPrice() { public void setPrice(float price) { @Override |
最后,我们还要把这个集合对象中的数据生成一个新的XML文档,生成的XML结构跟原始文档略有不同,是下面这种格式:
代码如下 | 复制代码 |
<?xml version="1.0" encoding="UTF-8"?> <books> <book id="1001"> <name>Thinking In Java</name> <price>80.0</price> </book> <book id="1002"> <name>Core Java</name> <price>90.0</price> </book> <book id="1003"> <name>Hello, Andriod</name> <price>100.0</price> </book> </books> |
接下来,就该介绍操作过程了,我们先为解析器定义一个BookParser接口,每种类型的解析器需要实现此接口。BookParser.java代码如下:
代码如下 | 复制代码 |
package com.scott.xml.parser; import java.io.InputStream; import com.scott.xml.model.Book; public interface BookParser { |