zoukankan      html  css  js  c++  java
  • 使用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. }  

    运行效果:

  • 相关阅读:
    css下背景渐变与底部固定的蓝天白云
    indy10中idtcpclient的使用问题[和大华电子称数据交换]
    cliendataset中自增长字段的处理
    和大华电子称进行对数据通讯
    cxgrid主从表的困惑
    基于xml基类的web查询
    关于屏幕文件
    基于xml文件查询的xml文件之生成篇
    关于400改程序
    Tapestry Spring Hibernate整合工作小结[摘]
  • 原文地址:https://www.cnblogs.com/handsome1013/p/5133537.html
Copyright © 2011-2022 走看看