码迷,mamicode.com
首页 > 其他好文 > 详细

使用SAX解析XML文件

时间:2014-10-29 19:28:54      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   ar   使用   java   

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解析:

    

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <root>  
  3.     <student id="1" group="1">  
  4.         <name>张三</name>  
  5.         <sex></sex>  
  6.         <age>18</age>  
  7.         <email>zhangsan@163.com</email>  
  8.         <birthday>1987-06-08</birthday>  
  9.         <memo>好学生</memo>  
  10.     </student>  
  11.     <student id="2" group="2">  
  12.         <name>李四</name>  
  13.         <sex></sex>  
  14.         <age>18</age>  
  15.         <email>lisi@163.com</email>  
  16.         <birthday>1987-06-08</birthday>  
  17.         <memo>好学生</memo>  
  18.     </student>  
  19.     <student id="3" group="3">  
  20.         <name>小王</name>  
  21.         <sex></sex>  
  22.         <age>18</age>  
  23.         <email>xiaowang@163.com</email>  
  24.         <birthday>1987-06-08</birthday>  
  25.         <memo>好学生</memo>  
  26.     </student>  
  27.     <student id="4" group="4">  
  28.         <name>小张</name>  
  29.         <sex></sex>  
  30.         <age>18</age>  
  31.         <email>xiaozhang@163.com</email>  
  32.         <birthday>1987-06-08</birthday>  
  33.         <memo>好学生</memo>  
  34.     </student>  
  35.     <student id="5" group="5">  
  36.         <name>小明</name>  
  37.         <sex></sex>  
  38.         <age>18</age>  
  39.         <email>xiaoming@163.com</email>  
  40.         <birthday>1987-06-08</birthday>  
  41.         <memo>好学生</memo>  
  42.     </student>  
  43. </root>  

     xml对应的Javabean:

  

public class Student {  
      
    private int id;  
    private int group;  
    private String name;  
    private String sex;  
    private int age;  
    private String email;  
    private String memo;  
    private String birthday;  
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public int getGroup() {  
        return group;  
    }  
    public void setGroup(int group) {  
        this.group = group;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public String getSex() {  
        return sex;  
    }  
    public void setSex(String sex) {  
        this.sex = sex;  
    }  
    public int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  
    public String getEmail() {  
        return email;  
    }  
    public void setEmail(String email) {  
        this.email = email;  
    }  
    public String getMemo() {  
        return memo;  
    }  
    public void setMemo(String memo) {  
        this.memo = memo;  
    }  
    public String getBirthday() {  
        return birthday;  
    }  
    public void setBirthday(String birthday) {  
        this.birthday = birthday;  
    }  
      
}  


 开始解析:

 

import java.util.ArrayList;  
import java.util.List;  
  
  
import org.xml.sax.Attributes;  
import org.xml.sax.SAXException;  
import org.xml.sax.helpers.DefaultHandler;  
  
  
  
/**  
 * 功能描述:采用sax方式解析XML<br>  
 *   
 * @author sxyx2008  
 *  
 */  
public class SaxParseXml extends DefaultHandler{  
  
    //存放遍历集合  
    private List<Student> list;  
    //构建Student对象  
    private Student student;  
    //用来存放每次遍历后的元素名称(节点名称)  
    private String tagName;  
      
      
    public List<Student> getList() {  
        return list;  
    }  
  
  
    public void setList(List<Student> list) {  
        this.list = list;  
    }  
  
  
    public Student getStudent() {  
        return student;  
    }  
  
  
    public void setStudent(Student student) {  
        this.student = student;  
    }  
  
  
    public String getTagName() {  
        return tagName;  
    }  
  
  
    public void setTagName(String tagName) {  
        this.tagName = tagName;  
    }  
  
  
    //只调用一次  初始化list集合    
    @Override  
    public void startDocument() throws SAXException {  
        list=new ArrayList<Student>();  
    }  
      
      
    //调用多次    开始解析  
    @Override  
    public void startElement(String uri, String localName, String qName,  
            Attributes attributes) throws SAXException {  
        if(qName.equals("student")){  
            student=new Student();  
            //获取student节点上的id属性值  
            student.setId(Integer.parseInt(attributes.getValue(0)));  
            //获取student节点上的group属性值  
            student.setGroup(Integer.parseInt(attributes.getValue(1)));  
        }  
        this.tagName=qName;  
    }  
      
      
    //调用多次    
    @Override  
    public void endElement(String uri, String localName, String qName)  
            throws SAXException {  
        if(qName.equals("student")){  
            this.list.add(this.student);  
        }  
        this.tagName=null;  
    }  
      
      
    //只调用一次  
    @Override  
    public void endDocument() throws SAXException {  
    }  
      
    //调用多次  
    @Override  
    public void characters(char[] ch, int start, int length)  
            throws SAXException {  
        if(this.tagName!=null){  
            String date=new String(ch,start,length);  
            if(this.tagName.equals("name")){  
                this.student.setName(date);  
            }  
            else if(this.tagName.equals("sex")){  
                this.student.setSex(date);  
            }  
            else if(this.tagName.equals("age")){  
                this.student.setAge(Integer.parseInt(date));  
            }  
            else if(this.tagName.equals("email")){  
                this.student.setEmail(date);  
            }  
            else if(this.tagName.equals("birthday")){  
                this.student.setBirthday(date);  
            }  
            else if(this.tagName.equals("memo")){  
                this.student.setMemo(date);  
            }  
        }  
    }  
}  


    测试方法:

 

import javax.xml.parsers.SAXParser;  
import javax.xml.parsers.ParserConfigurationException;  
import javax.xml.parsers.SAXParserFactory;  
  
import org.xml.sax.SAXException;  
  
import java.io.IOException;  
import java.io.InputStream;  
import java.util.List;  
  
public class Test {  
  
    public static void main(String[] args) {  
        SAXParser parser = null;  
        try {  
            //构建SAXParser  
            parser = SAXParserFactory.newInstance().newSAXParser();  
            //实例化  DefaultHandler对象  
            SaxParseXml parseXml=new SaxParseXml();  
            //加载资源文件 转化为一个输入流  
            InputStream stream=SaxParseXml.class.getClassLoader().getResourceAsStream("student.xml");  
            //调用parse()方法  
            parser.parse(stream, parseXml);  
            //遍历结果  
            List<Student> list=parseXml.getList();  
            for(Student student: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 (ParserConfigurationException e) {  
            e.printStackTrace();  
        } catch (SAXException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
      
}  


运行效果:

bubuko.com,布布扣

使用SAX解析XML文件

标签:style   blog   http   io   color   os   ar   使用   java   

原文地址:http://blog.csdn.net/huluhong/article/details/40589091

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!