SAX解析xml文件

首先介绍SAX解析,SAX是事件驱动型XML解析的一个标准接口不会改变 SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。下面结合代码分析

public class SAXPersonService {

public List<Person> getPersons (InputStream instream) throws Exception{
SAXParserFactory factory = SAXParserFactory.newInstance();//创建SAX解析工厂
SAXParser paser = factory.newSAXParser();//创建SAX解析器
PersonPaser personPaser=new PersonPaser();//创建事件处理程序
paser.parse(instream,personPaser);//开始解析
instream.close();//关闭输入流
return personPaser.getPersons();//返回解析后的内容

}
public final class PersonPaser extends DefaultHandler{//创建事件处理程序,
也就是编写ContentHandler的实现类,一般继承自DefaultHandler类

public List<Person> getPersons() {
return persons;
}
private List<Person> persons=null;
private String tagName=null;
private Person person=null;

{

//遇到文档开始标记的时候创建person集合
public void startDocument() throws SAXExceptionpersons=new ArrayList<Person>();
}
//遇到元素节点开始时候的处理方法
public void startElement(String uri,String localName,String qName,
Attributes attributes) throws SAXException {
tagName = localName;

//如果遇到<person>标记,则创建一个person
if("person".equals(tagName)){
person = new Person();
person.setId(new Integer(attributes.getValue(0)));//取出标记内的属性
}

}

//遇到文本节点时的操作

public void characters(char[] ch,int start,int length)
throws SAXException {
if(tagName!=null){//文本节点必须前面要有元素节点开始标记
String data = new String(ch,start,length);//取出文本节点的值
if("name".equals(tagName)){//如果前面的元素节点开始标记是name
person.setName(data);//则将文本节点的值赋值给person的Name
}else if("age".equals(tagName)){//如果前面元素节点开始标记是age
person.setAge(new Short(data));//则将本节点的值赋值给person的Age
}
}

}

//遇到元素节点结束时候的操作
public void endElement(String uri,String qName)
throws SAXException {
if("person".equals(localName)){//如果遇到</person>标记
persons.add(person);//则将创建完成的person加入到集合中去
person=null;//置空下一个person
}
tagName=null;//置空已有标记,因为要解析下一个节点了
}
}

至此,SAX解析完毕!

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念