美文网首页我爱编程
XML解析-最快的方式SAX

XML解析-最快的方式SAX

作者: 晏子小七 | 来源:发表于2018-05-02 16:27 被阅读101次

    XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。

    XML 的解析方式分为四种:1、 DOM 解析;2、 SAX 解析;3、 JDOM 解析;4、 DOM4J 解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。

    下面主要介绍最快的解析方式SAX解析:
    SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

    优点:

    1、采用事件驱动模式,对内存耗费比较小。

    2、适用于只处理XML文件中的数据时。

    缺点:

    1、编码比较麻烦。

    2、很难同时访问XML文件中的多处不同数据。
    Book为实体类;SAXTest为解析类;
    如下:
    public class Book {

    private String id;
    private String name;
    private String author;
    private String year;
    private String price;
    private String language;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public String getYear() {
        return year;
    }
    public void setYear(String year) {
        this.year = year;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
    public String getLanguage() {
        return language;
    }
    public void setLanguage(String language) {
        this.language = language;
    }
    

    }


    public class SAXTest {
    /**
    * @param args
    */
    public static void main(String[] args) {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    try {
    SAXParser parser = factory.newSAXParser();
    SAXParserHandler handler = new SAXParserHandler();
    parser.parse("books.xml", handler);
    System.out.println("!~!共有" + handler.getBookList().size()
    + "本书");
    for (Book book : handler.getBookList()) {
    System.out.println(book.getId());
    System.out.println(book.getName());
    System.out.println(book.getAuthor());
    System.out.println(book.getYear());
    System.out.println(book.getPrice());
    System.out.println(book.getLanguage());
    System.out.println("----finish----");
    }
    } catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (SAXException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }

    public class SAXParserHandler extends DefaultHandler {
    String value = null;
    Book book = null;
    private ArrayList<Book> bookList = new ArrayList<Book>();
    public ArrayList<Book> getBookList() {
    return bookList;
    }

    int bookIndex = 0;
    /**
     * 用来标识解析开始
     */
    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.startDocument();
        System.out.println("SAX解析开始");
    }
    
    /**
     * 用来标识解析结束
     */
    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.endDocument();
        System.out.println("SAX解析结束");
    }
    
    /**
     * 解析xml元素
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        //调用DefaultHandler类的startElement方法
        super.startElement(uri, localName, qName, attributes);
        if (qName.equals("book")) {
            bookIndex++;
            //创建一个book对象
            book = new Book();
            //开始解析book元素的属性
            System.out.println("======================开始遍历某一本书的内容=================");
            //不知道book元素下属性的名称以及个数,如何获取属性名以及属性值
            int num = attributes.getLength();
            for(int i = 0; i < num; i++){
                System.out.print("book元素的第" + (i + 1) +  "个属性名是:"
                        + attributes.getQName(i));
                System.out.println("---属性值是:" + attributes.getValue(i));
                if (attributes.getQName(i).equals("id")) {
                    book.setId(attributes.getValue(i));
                }
            }
        }
        else if (!qName.equals("name") && !qName.equals("bookstore")) {
            System.out.print("节点名是:" + qName + "---");
        }
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        //调用DefaultHandler类的endElement方法
        super.endElement(uri, localName, qName);
        //判断是否针对一本书已经遍历结束
        if (qName.equals("book")) {
            bookList.add(book);
            book = null;
            System.out.println("======================结束遍历某一本书的内容=================");
        }
        else if (qName.equals("name")) {
            book.setName(value);
        }
        else if (qName.equals("author")) {
            book.setAuthor(value);
        }
        else if (qName.equals("year")) {
            book.setYear(value);
        }
        else if (qName.equals("price")) {
            book.setPrice(value);
        }
        else if (qName.equals("language")) {
            book.setLanguage(value);
        }
    }
    
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);
        value = new String(ch, start, length);
        if (!value.trim().equals("")) {
            System.out.println("节点值是:" + value);
        }
    }
    

    }


    解析xml入库:
    package xmlParse;

    import java.io.File;
    import java.sql.*;
    import java.util.Iterator;
    import java.util.List;

    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;

    import org.xml.sax.helpers.DefaultHandler;

    import java.io.IOException;

    public class JieXiXml extends DefaultHandler{

    public static void main(String[] args) throws IOException{  
      
        System.out.println("提取xml数据并导入数据库");
        String path = "C:/Users/admin/Desktop/";
        //读取xml文件的数据并写入数据库中
         //InsertData(path);
         BianliXML(path);
        //读取数据库中的数据并写入xml文档
         // SelectData();
        
         
          }  
    
    
    
    @SuppressWarnings("null")
    private static void InsertData(String path) {
    
        Connection conn = null;// 创建一个数据库连接  
        PreparedStatement pstmt = null;// 创建预编译语句对象,一般都是用这个而不用Statement  
        StringBuffer sql = new StringBuffer("insert into sensor_all_data(sensor_imei,sensor_des,sensor_length,sensor_success_or_fail,sensor_first_time,sensor_accept_time) values ");  
        //path = "C:/Users/admin/Desktop/";
       
        try{  
            JdbcUtil ju = new JdbcUtil();
            conn = ju.getGJZXCon();
            conn.setAutoCommit(false);
            //准备执行sql语句
                    
            //读取xml文件  
            
           // Document doc=new SAXReader().read(new InputStreamReader(
                //  new FileInputStream(new File(path)),"utf-8"));  
           // Element node = doc.getRootElement();  
            //System.out.println("导入数据库的xml数据如下:\n"+ System.currentTimeMillis());
            
           // pstmt=conn.prepareStatement(sql); 
          //选择xml文件的节点  
    
            File file = new File(path);
            SAXParserFactory saxParFac = SAXParserFactory.newInstance();
            SaxParseXml parseXml = new SaxParseXml();
           
            SAXParser saxParser = saxParFac.newSAXParser();
            saxParser.parse(file, parseXml);
            long s = System.currentTimeMillis();
            List<XmlObj> itemList=parseXml.getContactList(); 
            
          //遍历读出的xml中的节点  
           int i=0;
           int size = itemList.size();
           for(Iterator<XmlObj> iter=itemList.iterator();iter.hasNext();){  
               XmlObj xo = iter.next();
               String s1 = xo.getImei();
               String s2 = xo.getDes();
               String s3 = xo.getLen();
               String s4 = xo.getSorf();
               String s5 = xo.getFirsttime();
               String s6 = xo.getAccepttime();
              sql.append("('").append(s1).append("','");
              sql.append(s2).append("','");
              sql.append(s3).append("','");
              sql.append(s4).append("','");
              sql.append(s5).append("','");
              sql.append(s6).append("')");
              i++;
              if(i<size){
                 sql.append(",");
              }
               //System.out.println(sensor_imei + "\t" + sensor_des + "\t" + sensor_length + "\t" + 
                //     sensor_success_or_fail + "\t" + sensor_first_time + "\t" + sensor_accept_time + "\t" + "\t" );
               //为sql语句赋值  
             /*  pstmt.setString(1, sensor_imei);  
               pstmt.setString(2, sensor_des);  
               pstmt.setString(3, sensor_length);  
               pstmt.setString(4, sensor_success_or_fail);  
               pstmt.setString(5, sensor_first_time);  
               pstmt.setString(6, sensor_accept_time);   */
               //pstmt.addBatch(); 
           }  
           long end = System.currentTimeMillis();;
           System.out.println("循环时间:\n"+ (System.currentTimeMillis()-s)/1000+"秒");
           pstmt=conn.prepareStatement(sql.toString()); 
           pstmt.executeUpdate();  
           conn.commit();
           conn.close();
           pstmt.close();
           System.out.print("将XML文档数据导入数据库成功\n"+ (System.currentTimeMillis()-end)/1000+"秒");  
       }
       //捕获连接数据库异常  
       catch ( SQLException sqlex ) {  
           System.err.println( "无法连接数据库" );  
           sqlex.printStackTrace();   
       }  
       catch(Exception e){  
           e.printStackTrace();  
       }finally{  
           try {  
               // 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源  
               // 注意关闭的顺序,最后使用的最先关闭   
               if (pstmt != null)  
                   pstmt.close();  
               if (conn != null)  
                   conn.close();   
           } catch (Exception e) {  
               e.printStackTrace();  
           }  
       }  
    

    }

    public static void BianliXML(String path){
        // String path = "C:/Users/admin/Desktop/";
            
    
            File file = new File(path);
            String[] filename = file.list();
            for (String obj : filename) {
                if(obj.endsWith("xml")){
                    try {
                        InsertData(path + obj);
                    } catch (Exception e) {
                        System.out.println("出现异常");
                    }
                    // 将已读文件删除
                    File fileBak = new File(path + obj);
                    fileBak.delete();
                }else{
                    continue;
                }
            }
    }
    

    }


    package xmlParse;

    import java.util.ArrayList;
    import java.util.List;

    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;

    public class SaxParseXml extends DefaultHandler{
    //定义一个集合,用于存储联系人对象
    private List<XmlObj> conList= new ArrayList<XmlObj>();
    private XmlObj xmlobj;
    /*
    * 定义一个变量用于记录标签的名字
    * 以便关联标签与标签的文本内容
    */
    private String Tag;
    @Override
    public void startElement(String uri, String localName,
    String qName, Attributes attributes) throws SAXException {
    Tag=qName;
    if("data".equals(qName)){
    xmlobj = new XmlObj();
    String idValue=attributes.getValue("id");
    //xmlobj.setId(idValue);
    }
    }

    @Override
    public void endElement(String uri, 
            String localName, String qName) throws SAXException {
        //结束时 ,将标记置为空,防止给Contact内的值重复赋值。
        Tag=null;
        //当读到contact结束标签时,说明一个联系人读完了,存到集合中
        if("data".equals(qName)){
            conList.add(xmlobj);
        }
    }
    
    @Override
    public void characters(char[] ch, int start, int length) 
            throws SAXException {
        //获取文本内容
        String content=new String(ch,start,length);
        if("imei".equals(Tag)){
            xmlobj.setImei(content);
        }else if("des".equals(Tag)){
            xmlobj.setDes(content);
        }else if("len".equals(Tag)){
            xmlobj.setLen(content);
        }else if("sorf".equals(Tag)){
            xmlobj.setSorf(content);
        }else if("firsttime".equals(Tag)){
            xmlobj.setFirsttime(content);
        }else if("accepttime".equals(Tag)){
            xmlobj.setAccepttime(content);
        }
    
    }
    public  List<XmlObj> getContactList(){
        return conList;
    }
    

    }

    相关文章

      网友评论

        本文标题:XML解析-最快的方式SAX

        本文链接:https://www.haomeiwen.com/subject/bcycrftx.html