使用SAX解析XML檔案

來源:互聯網
上載者:User

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

    

<?xml version="1.0" encoding="UTF-8"?><root>    <student id="1" group="1">        <name>張三</name>        <sex>男</sex>        <age>18</age>        <email>zhangsan@163.com</email>        <birthday>1987-06-08</birthday>        <memo>好學生</memo>    </student>    <student id="2" group="2">        <name>李四</name>        <sex>女</sex>        <age>18</age>        <email>lisi@163.com</email>        <birthday>1987-06-08</birthday>        <memo>好學生</memo>    </student>    <student id="3" group="3">        <name>小王</name>        <sex>男</sex>        <age>18</age>        <email>xiaowang@163.com</email>        <birthday>1987-06-08</birthday>        <memo>好學生</memo>    </student>    <student id="4" group="4">        <name>小張</name>        <sex>男</sex>        <age>18</age>        <email>xiaozhang@163.com</email>        <birthday>1987-06-08</birthday>        <memo>好學生</memo>    </student>    <student id="5" group="5">        <name>小明</name>        <sex>男</sex>        <age>18</age>        <email>xiaoming@163.com</email>        <birthday>1987-06-08</birthday>        <memo>好學生</memo>    </student></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();        }    }    }

運行效果:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.