zoukankan      html  css  js  c++  java
  • SAX解析XML

    数据量大的xml建议使用SAX解析提高解析速度。SAX是Simple API for XML的缩写,它是事件驱动的,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。

    解析过程: 
    (1)创建SAX解析器 
    SAXParserFactory factory=SAXParserFactory.newInstance(); 

    (2)实现解析DefaultHandler 
    主要实现其中的5个方法: 
    Void startDocument(), void endDocument(), void startElement(String uri,String localName,string qName,Attributes attr). 
    Void endElement(String uri,String localName,string qName),void characters(char[] ch,int start,int lenth)

     

    下面对这个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>
    </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;
          
        //省略get/set方法......  
    }

    开始解析:

    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 smn
     *
     */
    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(student);
                }
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }
  • 相关阅读:
    自定判断代码的执行环境
    将某个Qt4项目升级到Qt5遇到的问题[转]
    QT 智能提示设置
    c++基础 explicit
    Qt 5.2 Creator 和 vs2012 QT 插件的安装
    servlet乱码问题总结
    c++基础 使用智能指针
    Servlet学习之web服务器Tomcat 详解
    Windows数据类型
    友元类
  • 原文地址:https://www.cnblogs.com/lm970585581/p/7728280.html
Copyright © 2011-2022 走看看