[Android范例] 让人人都懂XML解析,Pull方式解析Xml的详尽注释
[Android实例] 让人人都懂XML解析,Pull方式解析Xml的详尽注释解析Xml有三种方式可选,sax ,dom ,pull??,,各
[Android实例] 让人人都懂XML解析,Pull方式解析Xml的详尽注释
解析Xml有三种方式可选,sax ,dom ,pull??,,各有各的优点,但在android上是不推荐使用DOM来解析的
一般都用SAX和PULL 这两个性能相近, SAX的解析方式大家可以去看MARS的教程 讲的也比较好喔
PULL的话我个人觉得处理事件比较简单,所以就给不懂的同学详细讲讲,嘿嘿....希望大家都能明白
感谢 传智的张老师,黎老师, 感谢勇军哥
首先给大家看看我的笔记
那么我们就开始吧
很简单,这是我们要解析的xml文件,直接放在src之下
<students>
<student id = "1">
<name>伍业雄</name>
<age>22</age>
</student>
<student id = "2">
<name>陈俊安</name>
<age>21</age>
</student>
<student id = "3">
<name>王世铭</name>
<age>22</age>
</student>
</students>
复制代码
写个bean??嘿嘿.<我都没学java web??原来这东西叫Bean>
package tree.love.bean;
import java.io.Serializable;
public class Person implements Serializable{
private int id ;
private String name ;
private int age ;
public int getId() {
??return id;
}
public void setId(int id) {
??this.id = id;
}
public String getName() {
??return name;
}
public void setName(String name) {
??this.name = name;
}
public int getAge() {
??return age;
}
public void setAge(int age) {
??this.age = age;
}
public Person(){}
public Person(String name ,int age )
{
??this.name = name ;
??this.age = age ;
}
@Override
public String toString() {
??
??return this.name +",,"+this.age;
}
}
复制代码
然后这就是解析xml的代码了.返回一个List<T>
package tree.love.xmlUitl;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import tree.love.bean.Person;
import android.util.Log;
import android.util.Xml;
public class MyPullxml {
private static final String XMLPULL_INFO = "XmlPull_Info";
public static List<Person> getDate(InputStream inStream)
{
??List<Person> persons = null ;
??Person currentPerson = null ;
??
??/**
? ?* android给我们提供了一个工具类'Xml'
? ?* 通过这个工具类可以很方便地去new一个Pull的解析器,返回类型是XmlPullParser
? ?*
? ?**/
??XmlPullParser xmlPull = Xml.newPullParser();
??
??try {
? ?/**
? ? * 提供的xml内容方式都是以输入流的方式InputStream
? ? **/
? ?xmlPull.setInput(inStream,"UTF-8");
? ?/**
? ? * 触发事件getEventType() =>返回事件码
? ? * 当它遇到某个字符,如果符合xml的语法规范.
? ? * 它就会出发这个语法所代表的数字
? ? * Returns the type of the current event (START_TAG, END_TAG, TEXT, etc.)
? ? **/
? ?int eventCode = xmlPull.getEventType();
? ?
? ?/**
? ? * 解析事件:
? ? * StartDocument,文档开始
? ? * Enddocument,文档结束
? ? *
? ? *??每次读到一个字符,就产生一个事件
? ? *??只要解析xml文档事件不为空,就一直往下读
? ? **/
? ?while (eventCode != XmlPullParser.END_DOCUMENT)
? ?{
? ? switch (eventCode)
? ? {
? ?
? ? case XmlPullParser.START_DOCUMENT: //文档开始事件,可以做一些数据初始化处理
? ???persons = new ArrayList<Person>();
? ???break;
? ???
? ? case XmlPullParser.START_TAG://元素开始.
? ???String name = xmlPull.getName();
? ???if(name.equalsIgnoreCase("student"))
? ???{
? ?? ?currentPerson = new Person();
? ?? ?currentPerson.setId(new Integer(xmlPull.getAttributeValue(null, "id")));
? ???}
? ???else if(currentPerson != null)
? ???{
? ?? ?if(name.equalsIgnoreCase("name"))
? ?? ?{
? ?? ? currentPerson.setName(xmlPull.nextText());
? ?? ?}
? ?? ?else if(name.equalsIgnoreCase("age"))
? ?? ?{
? ?? ? currentPerson.setAge(new Short(xmlPull.nextText()));
? ?? ?}
? ???}
? ???break;
? ? case XmlPullParser.END_TAG: //元素结束,
? ???if(currentPerson != null && xmlPull.getName().equalsIgnoreCase("student"))
? ???{
? ?? ?persons.add(currentPerson);
? ?? ?currentPerson = null ;
? ???}
? ???break;
? ? }
? ? eventCode = xmlPull.next();//进入到一下一个元素.
? ?}
??} catch (XmlPullParserException e) {
? ?
? ?Log.i(XMLPULL_INFO, e.toString());
??} catch (IOException e) {
? ?
? ?Log.i(XMLPULL_INFO, e.toString());
??}
??return persons;
}
}
复制代码
最后xml的数据这东西 写好之后最好能用Android Junit 一下.再与之数据交互 ,放进listView 或者Gridview
package tree.love.action;
import java.io.InputStream;
import java.util.List;
import tree.love.bean.Person;
import tree.love.xmlUitl.MyPullxml;
import android.test.AndroidTestCase;
import android.util.Log;
public class xmlText extends AndroidTestCase {
public void PullXmlText() throws Exception
{
InputStream instream = this.getClass().getClassLoader().getResourceAsStream("student.xml");
List<Person> persons = MyPullxml.getDate(instream);
for(Person person : persons)
{
Log.i("XML", person.toString());
}
}
}
复制代码