source:http://blog.csdn.net/wangkuifeng0118/article/details/7305068
SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准,虽然如此,使用SAX的还是不少,几乎所有的XML解析器都会支持它。
与DOM比较而言,SAX是一种轻量型的方法。我们知道,在处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成DOM树上的每个Node对象。当文档比较小的时候,这不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事(比如在applet中)。这时候,一个较好的替代解决方法就是SAX。
SAX在概念上与DOM完全不同。它不同于DOM的文档驱动,它是事件驱动的,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。
下面对这个xml文件使用sax解析:
- <?xmlversion="1.0"encoding="UTF-8"?>
- <root>
- studentid="1"group="1">
- name>张三</sex>男age>18email>zhangsan@163.combirthday>1987-06-08memo>好学生studentstudentid="2"group="2">李四>女>lisi@163.comstudentid="3"group="3">小王>xiaowang@163.comstudentid="4"group="4">小张>xiaozhang@163.comstudentid="5"group="5">小明>xiaoming@163.com>
xml对应的Javabean:
copy
publicclassStudent{
-
- privateintid;
- privateintgroup;
- privateStringname;
- privateStringsex;
- privateintage;
- privateStringemail;
- privateStringmemo;
- privateStringbirthday;
- publicintgetId(){
- returnid;
- }
- publicvoidsetId(intid){
- this.id=id;
- }
- publicintgetGroup(){
- returngroup;
- publicvoidsetGroup(intgroup){
- this.group=group;
- publicStringgetName(){
- returnname;
- publicvoidsetName(Stringname){
- this.name=name;
- publicStringgetSex(){
- returnsex;
- publicvoidsetSex(Stringsex){
- this.sex=sex;
- publicintgetAge(){
- returnage;
- publicvoidsetAge(intage){
- this.age=age;
- publicStringgetEmail(){
- returnemail;
- publicvoidsetEmail(Stringemail){
- this.email=email;
- publicStringgetMemo(){
- returnmemo;
- publicvoidsetMemo(Stringmemo){
- this.memo=memo;
- publicStringgetBirthday(){
- returnbirthday;
- publicvoidsetBirthday(Stringbirthday){
- this.birthday=birthday;
-
- }
开始解析:
copy
importjava.util.ArrayList;
- importjava.util.List;
- importorg.xml.sax.Attributes;
- importorg.xml.sax.SAXException;
- importorg.xml.sax.helpers.DefaultHandler;
- /**
- *功能描述:采用sax方式解析XMLbr *
- *@authorsxyx2008
- */
- publicclassSaxParseXmlextendsDefaultHandler{
- //存放遍历集合
- privateListStudent>list;
- //构建Student对象
- privateStudentstudent;
- //用来存放每次遍历后的元素名称(节点名称)
- privateStringtagName;
- publicList>getList(){
- returnlist;
- publicvoidsetList(List>list){
- this.list=list;
- publicStudentgetStudent(){
- returnstudent;
- publicvoidsetStudent(Studentstudent){
- this.student=student;
- publicStringgetTagName(){
- returntagName;
- publicvoidsetTagName(StringtagName){
- this.tagName=tagName;
- //只调用一次初始化list集合
- @Override
- publicvoidstartDocument()throwsSAXException{
- list=newArrayList>();
- //调用多次开始解析
- @Override
- publicvoidstartElement(Stringuri,StringlocalName,StringqName,
- Attributesattributes)throwsSAXException{
- if(qName.equals("student")){
- student=newStudent();
- //获取student节点上的id属性值
- student.setId(Integer.parseInt(attributes.getValue(0)));
- //获取student节点上的group属性值
- student.setGroup(Integer.parseInt(attributes.getValue(1)));
- this.tagName=qName;
- //调用多次
- publicvoidendElement(Stringuri,StringqName)
- throwsSAXException{
- if(qName.equals("student")){
- this.list.add(this.student);
- this.tagName=null;
- //只调用一次
- publicvoidendDocument()throwsSAXException{
- publicvoidcharacters(char[]ch,intstart,intlength)
- if(this.tagName!=null){
- Stringdate=newString(ch,start,length);
- if(this.tagName.equals("name")){
- this.student.setName(date);
- elseif(this.tagName.equals("sex")){
- this.student.setSex(date);
- elseif(this.tagName.equals("age")){
- this.student.setAge(Integer.parseInt(date));
- elseif(this.tagName.equals("email")){
- this.student.setEmail(date);
- elseif(this.tagName.equals("birthday")){
- this.student.setBirthday(date);
- elseif(this.tagName.equals("memo")){
- this.student.setMemo(date);
- }
测试方法:
copy
importjavax.xml.parsers.SAXParser;
- importjavax.xml.parsers.ParserConfigurationException;
- importjavax.xml.parsers.SAXParserFactory;
- importorg.xml.sax.SAXException;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.util.List;
- publicclassTest{
- publicstaticvoidmain(String[]args){
- SAXParserparser=null;
- try{
- //构建SAXParser
- parser=SAXParserFactory.newInstance().newSAXParser();
- //实例化DefaultHandler对象
- SaxParseXmlparseXml=newSaxParseXml();
- //加载资源文件转化为一个输入流
- InputStreamstream=SaxParseXml.class.getClassLoader().getResourceAsStream("student.xml");
- //调用parse()方法
- parser.parse(stream,parseXml);
- //遍历结果
- List>list=parseXml.getList();
- for(Studentstudent:list){
- System.out.println("id:"+student.getId()+"tgroup:"+student.getGroup()+"tname:"+student.getName()+"tsex:"+student.getSex()+"tage:"+student.getAge()+"temail:"+student.getEmail()+"tbirthday:"+student.getBirthday()+"tmemo:"+student.getMemo());
- }catch(ParserConfigurationExceptione){
- e.printStackTrace();
- }catch(SAXExceptione){
- }catch(IOExceptione){
- 运行效果:
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|