package com.andy.android.saxtest;
import java.util.ArrayList;
import java.util.List;
import com.andy.android.domain.Person;
import java.io.InputStream;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXxml {
/*
* 解析后返回person的list结构
* @param 输入流,xml 文件的输入流
* */
public List<Person> getPerson(InputStream inputstream) throws Throwable{
//获得解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//从解析器工厂new一个解析器
SAXParser parse = factory.newSAXParser();
PersonHandle perHandle = new PersonHandle();
//解析输入流,解析类使用perHandle类
parse.parse(inputstream, perHandle);
//返回所解析的结果
return perHandle.getPersons();
}
}
/**
*
* @author bluesky
* @function: 定义PersonHandle类,该类继承自DefaultHandle类,解析器在处理输入流的时候遇到相应的字段会自动触发该类中的一些事件。
*
*/
class PersonHandle extends DefaultHandler{
List<Person> persons = null;
private String preTag = null;
private Person person = null;
/**
*
* @return 返回person的列表
*/
public List<Person> getPersons(){
return persons;
}
/**
* 重载函数,解析器遇到文本时自动解析
* @param ch :字符串,
* @param start :字符串的起始部分
* @param length:字符串的长度
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//如果某个文本前面的标签不为空,证明改文本是我们所关注的。
if(preTag!=null){
//获取文本字符串
String tempData = new String(ch,start,length);
//如果文本前面的标签是name,表明该字段的值是name,是我们需要提取的值
if("name".equals(preTag)){
person.setName(tempData);
}
//如果文本前面的标签是age,表明该字段的值是age,是我们需要提取的值
else if("age".equals(preTag)){
person.setAge(new Short(tempData));
}
}
}
/**
* 文档解析完成,我们不关心这块的值
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
/**
* 元素解析完成时自动触发该函数
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
//如果一个person解析完成之后,需要将保存在person 的值add 到List<Person> 里面去。并清空临时的person内容准备为下一次解析做准备。
if("person".equals(localName)){
persons.add(person);
person = null;
}
preTag = null;//恢复初始化
}
@Override
public void startDocument() throws SAXException {
//在文档开始的时候触发该函数,此时我们new一个people的list
persons = new ArrayList<Person>();
}
/**
* 遇到解析元素的时候会自动调用该函数
* @param uri :命名空间。
* @param localName 元素的名字
* @param qName :带命名空间的元素名字。
* @param attributes :属性名
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//如果第一个元素名为person的话,new一个person,表明遇到一个新的person需要解析了
if("person".equals(localName)){
person = new Person();
//首先获取属性,并设置属性。
Integer id = new Integer(attributes.getValue(0));
person.setId(id);
}
//记录下前一个标签的值,方便在后面的文本解析的时候知道解析的是什么字段。
preTag = localName;
}
}
评论0
最新资源