首先介绍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解析完毕! (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|