使用SAX解析XML文件

 

使用SAX解析XML文件

标签: xmlstringattributesdatelist文档
 分类:
    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:

  

[html] view plaincopy
 
  1. public class Student {  
  2.       
  3.     private int id;  
  4.     private int group;  
  5.     private String name;  
  6.     private String sex;  
  7.     private int age;  
  8.     private String email;  
  9.     private String memo;  
  10.     private String birthday;  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     public void setId(int id) {  
  15.         this.id = id;  
  16.     }  
  17.     public int getGroup() {  
  18.         return group;  
  19.     }  
  20.     public void setGroup(int group) {  
  21.         this.group = group;  
  22.     }  
  23.     public String getName() {  
  24.         return name;  
  25.     }  
  26.     public void setName(String name) {  
  27.         this.name = name;  
  28.     }  
  29.     public String getSex() {  
  30.         return sex;  
  31.     }  
  32.     public void setSex(String sex) {  
  33.         this.sex = sex;  
  34.     }  
  35.     public int getAge() {  
  36.         return age;  
  37.     }  
  38.     public void setAge(int age) {  
  39.         this.age = age;  
  40.     }  
  41.     public String getEmail() {  
  42.         return email;  
  43.     }  
  44.     public void setEmail(String email) {  
  45.         this.email = email;  
  46.     }  
  47.     public String getMemo() {  
  48.         return memo;  
  49.     }  
  50.     public void setMemo(String memo) {  
  51.         this.memo = memo;  
  52.     }  
  53.     public String getBirthday() {  
  54.         return birthday;  
  55.     }  
  56.     public void setBirthday(String birthday) {  
  57.         this.birthday = birthday;  
  58.     }  
  59.       
  60. }  

 开始解析:
[html] view plaincopy
 
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4.   
  5. import org.xml.sax.Attributes;  
  6. import org.xml.sax.SAXException;  
  7. import org.xml.sax.helpers.DefaultHandler;  
  8.   
  9.   
  10.   
  11. /**  
  12.  * 功能描述:采用sax方式解析XML<br>  
  13.  *   
  14.  * @author sxyx2008  
  15.  *  
  16.  */  
  17. public class SaxParseXml extends DefaultHandler{  
  18.   
  19.     //存放遍历集合  
  20.     private List<Student> list;  
  21.     //构建Student对象  
  22.     private Student student;  
  23.     //用来存放每次遍历后的元素名称(节点名称)  
  24.     private String tagName;  
  25.       
  26.       
  27.     public List<Student> getList() {  
  28.         return list;  
  29.     }  
  30.   
  31.   
  32.     public void setList(List<Student> list) {  
  33.         this.list = list;  
  34.     }  
  35.   
  36.   
  37.     public Student getStudent() {  
  38.         return student;  
  39.     }  
  40.   
  41.   
  42.     public void setStudent(Student student) {  
  43.         this.student = student;  
  44.     }  
  45.   
  46.   
  47.     public String getTagName() {  
  48.         return tagName;  
  49.     }  
  50.   
  51.   
  52.     public void setTagName(String tagName) {  
  53.         this.tagName = tagName;  
  54.     }  
  55.   
  56.   
  57.     //只调用一次  初始化list集合    
  58.     @Override  
  59.     public void startDocument() throws SAXException {  
  60.         list=new ArrayList<Student>();  
  61.     }  
  62.       
  63.       
  64.     //调用多次    开始解析  
  65.     @Override  
  66.     public void startElement(String uri, String localName, String qName,  
  67.             Attributes attributes) throws SAXException {  
  68.         if(qName.equals("student")){  
  69.             student=new Student();  
  70.             //获取student节点上的id属性值  
  71.             student.setId(Integer.parseInt(attributes.getValue(0)));  
  72.             //获取student节点上的group属性值  
  73.             student.setGroup(Integer.parseInt(attributes.getValue(1)));  
  74.         }  
  75.         this.tagName=qName;  
  76.     }  
  77.       
  78.       
  79.     //调用多次    
  80.     @Override  
  81.     public void endElement(String uri, String localName, String qName)  
  82.             throws SAXException {  
  83.         if(qName.equals("student")){  
  84.             this.list.add(this.student);  
  85.         }  
  86.         this.tagName=null;  
  87.     }  
  88.       
  89.       
  90.     //只调用一次  
  91.     @Override  
  92.     public void endDocument() throws SAXException {  
  93.     }  
  94.       
  95.     //调用多次  
  96.     @Override  
  97.     public void characters(char[] ch, int start, int length)  
  98.             throws SAXException {  
  99.         if(this.tagName!=null){  
  100.             String date=new String(ch,start,length);  
  101.             if(this.tagName.equals("name")){  
  102.                 this.student.setName(date);  
  103.             }  
  104.             else if(this.tagName.equals("sex")){  
  105.                 this.student.setSex(date);  
  106.             }  
  107.             else if(this.tagName.equals("age")){  
  108.                 this.student.setAge(Integer.parseInt(date));  
  109.             }  
  110.             else if(this.tagName.equals("email")){  
  111.                 this.student.setEmail(date);  
  112.             }  
  113.             else if(this.tagName.equals("birthday")){  
  114.                 this.student.setBirthday(date);  
  115.             }  
  116.             else if(this.tagName.equals("memo")){  
  117.                 this.student.setMemo(date);  
  118.             }  
  119.         }  
  120.     }  
  121. }  

    测试方法:
[html] view plaincopy
 
  1. import javax.xml.parsers.SAXParser;  
  2. import javax.xml.parsers.ParserConfigurationException;  
  3. import javax.xml.parsers.SAXParserFactory;  
  4.   
  5. import org.xml.sax.SAXException;  
  6.   
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.util.List;  
  10.   
  11. public class Test {  
  12.   
  13.     public static void main(String[] args) {  
  14.         SAXParser parser = null;  
  15.         try {  
  16.             //构建SAXParser  
  17.             parser = SAXParserFactory.newInstance().newSAXParser();  
  18.             //实例化  DefaultHandler对象  
  19.             SaxParseXml parseXml=new SaxParseXml();  
  20.             //加载资源文件 转化为一个输入流  
  21.             InputStream stream=SaxParseXml.class.getClassLoader().getResourceAsStream("student.xml");  
  22.             //调用parse()方法  
  23.             parser.parse(stream, parseXml);  
  24.             //遍历结果  
  25.             List<Studentlist=parseXml.getList();  
  26.             for(Student student:list){  
  27.                 System.out.println("id:"+student.getId()+" group:"+student.getGroup()+" name:"+student.getName()+" sex:"+student.getSex()+" age:"+student.getAge()+" email:"+student.getEmail()+" birthday:"+student.getBirthday()+" memo:"+student.getMemo());  
  28.             }  
  29.         } catch (ParserConfigurationException e) {  
  30.             e.printStackTrace();  
  31.         } catch (SAXException e) {  
  32.             e.printStackTrace();  
  33.         } catch (IOException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37.       
  38. }  

运行效果:

原文地址:https://www.cnblogs.com/handsome1013/p/5133537.html