您的位置:首页 > 移动开发 > Android开发

android学习之路6:xml数据解析的三种方式

2012-02-22 09:01 579 查看
好久没有写博客了,一方面大米没有时间,另一方面大米一直在潜心研究android,想等技术略有小成的时候在跟大家分享我学到的点滴,这篇博客介绍一下andorid解析读取xml数据格式的三种方式,并附上我的demo(文章最下面)。

xml网络数据传递的一种重要数据载体格式,android手机设备是移动的手机终端,所以对开发android应用来讲,xml数据解析是必须掌握的技术之一。一般有三种解析xml的方式,分别是:

1,DOM

2,SAX

3,PULL

首先看下demo界面:


点击三种解析方式的按钮,出现如下的log输出:


要解析的xml数据,NewFile:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>大米</name>
<age>26</age>
</person>
<person id="22">
<name>小米</name>
<age>25</age>
</person>
</persons>


对应的解析后的类,Person.java:

package com.leequer.Doem;

public class Person {
private String id ;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
private String name ;
private String age;
@Override
public String toString() {
return this.id+",名字:  "+this.name+"  年龄:  "+this.age+"\n";
}

}


1,DOM解析

public static List<Person> ReadXmlByDom ( InputStream inputStream){
List<Person> rivers=new ArrayList<Person>();
DocumentBuilderFactory factory=null;
DocumentBuilder builder=null;
Document document=null;
//首先找到xml文件
factory=DocumentBuilderFactory.newInstance();
try {
//找到xml,并加载文档
builder=factory.newDocumentBuilder();
document=builder.parse(inputStream);
//找到根Element
Element root=document.getDocumentElement();
NodeList nodes=root.getElementsByTagName("person");
//遍历根节点所有子节点,persons 下所有person
Person person=null;
for(int i=0;i<nodes.getLength();i++){
person=new Person();
//获取river元素节点
Element personElement=(Element)(nodes.item(i));
//获取river中id属性值
person.setId(personElement.getAttribute("id"));

//获取river下name和age标签(即node 节点)
Element name=(Element)personElement.getElementsByTagName("name").item(0);
person.setName(name.getFirstChild().getNodeValue());
Element age=(Element)personElement.getElementsByTagName("age").item(0);
person.setAge(age.getFirstChild().getNodeValue());
rivers.add(person);
}
}catch (IOException e){
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
catch (ParserConfigurationException e) {
e.printStackTrace();
}finally{
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return rivers;
}


2,SAX解析

public class ReadXmlBySaxService extends DefaultHandler {
public ArrayList <Person> personList = null;
Person person;
String tag;

//当遇到文档就触发
public void startDocument() throws SAXException {
Log.e("info", "begin");
personList =new  ArrayList<Person>();
}

//读取文档结束触发
public void endDocument() throws SAXException {
Log.e("info", "end");
}

//当遇到开始标签的时候就会触发这个方法
public void startElement(String namespaceURI, String localName,
String qName, Attributes attr) throws SAXException {
if (localName.equals("person")) {
person =  new Person();
//节点第一个属性值
person.setId(attr.getValue(0));
}
tag = localName;
}

public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
if (localName.equals("person")) {
//获取标签的全部属性
personList.add(person);
person = null;
}
tag=null;
}
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(data);
}
}
}

}


3,PULL解析

public static List<Person> ReadXmlByPull (InputStream inputStream)throws Exception
{
List <Person> personList = null;
/**
* android给我们提供了xml 用来得到xmlpull解析器
*/
XmlPullParser xmlpull = Xml.newPullParser();
/**
* 将输入流传入 设定编码方式
*
*/
xmlpull.setInput(inputStream, "utf-8");
/**
* pull读到xml后 返回数字
*
*   读取到xml的声明返回数字0 START_DOCUMENT;
读取到xml的结束返回数字1 END_DOCUMENT ;

读取到xml的开始标签返回数字2 START_TAG
读取到xml的结束标签返回数字3 END_TAG

读取到xml的文本返回数字4 TEXT
*/
int eventCode = xmlpull.getEventType();
/**
* 只要这个事件返回的不是1 我们就一直读取xml文件
*/
Person person = null;
while(eventCode!=XmlPullParser.END_DOCUMENT)
{

switch (eventCode)
{
case XmlPullParser.START_DOCUMENT:
{//开始文档 new数组
personList =new  ArrayList<Person>();
break;
}
case XmlPullParser.START_TAG:
{
if("person".equals(xmlpull.getName()))
{
person =  new Person();
//节点第一个属性值
person.setId(xmlpull.getAttributeValue(0));
}else if (person!=null)
{
if(("name".equals(xmlpull.getName())))
{
/**
* 如果当前元素的下一个元素是文本节点 就可以直接用nextText()这个方法来得到文本节点的内容
*/
person.setName(xmlpull.nextText());
}else if ("age".equals(xmlpull.getName()))
{
/**
* 如果当前元素的下一个元素是文本节点 就可以直接用nextText()这个方法来得到文本节点的内容
*/
person.setAge(xmlpull.nextText());
}
}
break;
}

case XmlPullParser.END_TAG:
{
if("person".equals(xmlpull.getName())&&person!=null)
{
personList.add(person);
person = null;
}
break;
}
}

eventCode = xmlpull.next();//没有结束xml文件就推到下个进行解析

}

return personList;
}


DEMO下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: