今天去书城看书,突然看到android网络编程方面,看到各种解析xml的方式,选择了一种比较高效的方式,写了一个demo测试。SAX这种方式以前有看过,但是一直没有使用过,感觉不写demo,自己永远不会使用。
工程结构如下:
需要解析的xml文件放在assets目录下,也可以放在其他目录。
person.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<Persons>
<Person id = "0">
<name>"张山"</name>
<age>"16"</age>
</Person>
<Person id = "1">
<name>"李四"</name>
<age>"17"</age>
</Person>
<Person id = "2">
<name>"王五"</name>
<age>"18"</age>
</Person>
</Persons>
主要进行解析工作的是SaxHander.java,代码如下:
package com.demo.saxxml;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
/**
* 此类主要负责对xml文档进行解析,继承DefaultHandler接口。
* 主要实现几个常用接口即可完成xml的解析。
*
* @author Jacky Zhu
*
*/
public class SaxHander extends DefaultHandler {
private final String TAG = "SaxHander";
private List<Person> persons;
private Person person;
// 用于标记上一次遍历的是哪个element,用于存储对应的文本
private String preTag;
/**
* 在开始解析xml文档时会执行此方法,在此方法中,可以做一些数据初始化的工作。
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
Log.i(TAG, "startDocument::");
persons = new ArrayList<Person>();
}
/**
* 在开始解析一个元素的时候执行此方法,在此方法中,根据localname来判定读取的是哪个元素。
* 主要是用于获取元素的属性值,并且存储。
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Log.i(TAG, "startElement::" + localName);
super.startElement(uri, localName, qName, attributes);
if ("Person".equals(localName)) {
person = new Person();
//因为person只有一个属性,可以这样去获取,若有多个时,可以采用循环的方式。
person.setId(attributes.getValue(0));
}
// 这一步很关键,否则将会导致读取文本值的错误。
preTag = localName;
}
/**
* 在开始解析元素文本值的时候调用此方法,在此方法中,要根据上一次解析的元素来存储文本。
* 空白文本也是可以被读取的,为了不被存储,必须进行和空比较。
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
// 获取文本内容
String content = new String(ch, start, length).trim();
Log.i(TAG, "characters::" + content);
if (!"".equals(content.trim())) { // 屏蔽空白文本
if ("name".equals(preTag)) {
person.setName(content);
} else if ("age".equals(preTag)) {
person.setAge(content);
}
}
}
/**
* 解析元素结束时调用此接口,当是实体是要添加进实体集合。
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
Log.i(TAG, "endElement::");
if ("Person".equals(localName)) {
persons.add(person);
person = null;
}
}
/**
* 结束文档解析时调用此接口。
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
Log.i(TAG, "endDocument::");
}
/**
* 获取解析得到的实体集合。
* @return
*/
public List<Person> getPersons() {
if (persons != null) {
return persons;
}
return null;
}
}
对应于xml中person的实体类,代码如下:
package com.demo.saxxml;
/**
* 实体类,对应于xml定义的实体属性。
* @author Jacky Zhu
*
*/
public class Person {
private String id;
private String name;
private String age;
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;
}
}
开始解析和载入xml的类,代码如下:
package com.demo.saxxml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
/**
* 载入xml文件和开始解析文档
* @author Jacky Zhu
*
*/
public class SaxXmlActivity extends Activity {
private final String TAG = "SaxXmlActivity";
private List<Person> persons = new ArrayList<Person>();
private InputStream xmlInputStream;
private SaxHander mSaxHander;
private SAXParser mSAXParser;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
// 获取文件流
xmlInputStream = getAssets().open("person.xml");
// 获取解析接口
mSaxHander = new SaxHander();
// 获取解析类
mSAXParser = SAXParserFactory.newInstance().newSAXParser();
// 开始解析
mSAXParser.parse(xmlInputStream, mSaxHander);
// 获取解析实体集合
persons = mSaxHander.getPersons();
for( int i = 0; i< persons.size(); i++){
System.out.println("id:"+persons.get(i).getId());
System.out.println("name:"+persons.get(i).getName());
System.out.println("age:"+persons.get(i).getAge());
}
} catch (IOException e) {
e.printStackTrace();
Log.i(TAG, "IOException::"+e.toString());
} catch (ParserConfigurationException e) {
e.printStackTrace();
Log.i(TAG, "ParserConfigurationException::"+e.toString());
} catch (SAXException e) {
e.printStackTrace();
Log.i(TAG, "SAXException::"+e.toString());
}
}
}
程序运行结果: