SAX 解析到文件,缓存到内存

目的
    通过一个小的SAX例子,我们更清晰的理解SAX的工作原理。

    本文例子主要实现:
    1. 将每个Employee信息输出到自己的文件中,文件名是以Employee ID和Employee Name来命名的,注意,观察代码中是如何得到Employee ID和Employee Name;
    2. 将每个Employee信息存入到Map中,其中,Map中的每个Value对应一个Employee的Collection,Map中的每个Key对应该Employee的ID。

    package shuai.study.sax.demo;  

    import java.io.File;
    import java.io.IOException;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.LinkedList;
    import java.util.Map;  

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

    import org.apache.commons.io.FileUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;  

    /**
     * @author shengshu
     *
     */
    public class SaxHandler extends DefaultHandler {
        private final static String leafNodeText = "|firstname|;|lastname|;|sex|;|country|;|province|;|city|;|village|;|mobile|;|mail|;|qq|;|postcode|;|profession|";  

        private Map<String, Collection<String>> companyMap = null;
        private Collection<String> employeeCollection = null;  

        private String currentValue = null;
        private String currentCharacters = null;  

        private StringBuffer idAndNameStringBuffer = null;  

        public SaxHandler(File inputFile) {
            this.parseDocument(inputFile);
        }  

        private void parseDocument(File inputFile) {
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();  

            try {
                SAXParser saxParser = saxParserFactory.newSAXParser();
                saxParser.parse(inputFile, this);
            } catch (ParserConfigurationException pce) {
                pce.printStackTrace();
            } catch (SAXException saxe) {
                saxe.printStackTrace();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }  

        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            this.companyMap = new HashMap<String, Collection<String>>();
        }  

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            if (qName.equalsIgnoreCase("Employee")) {
                this.employeeCollection = new LinkedList<String>();
                this.idAndNameStringBuffer = new StringBuffer();  

                this.currentValue = attributes.getValue("ID");
            }
        }  

        @Override
        public void characters(char[] buffer, int start, int length) {
            this.currentCharacters = new String(buffer, start, length);
        }  

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if (StringUtils.containsIgnoreCase(leafNodeText, "|" + qName + "|")) {
                this.employeeCollection.add(qName + ": " + this.currentCharacters);  

                if (qName.equalsIgnoreCase("FirstName")) {
                    this.idAndNameStringBuffer.append(this.currentCharacters);
                }  

                if (qName.equalsIgnoreCase("LastName")) {
                    this.idAndNameStringBuffer.append(this.currentCharacters);
                }
            }  

            if (qName.equalsIgnoreCase("Employee")) {
                this.companyMap.put(this.currentValue, this.employeeCollection);  

                this.idAndNameStringBuffer.append("-").append(this.currentValue);  

                this.writeEmployee(employeeCollection, idAndNameStringBuffer.toString());
            }
        }  

        private void writeEmployee(Collection<String> employeeCollection, String fileName) {
            String outputFileDirectory = SaxHandler.class.getResource("/file/output/").getPath();
            String outputFilePath = outputFileDirectory + fileName + ".xml";
            File outputFile = new File(outputFilePath);  

            try {
                FileUtils.writeLines(outputFile, employeeCollection, false);
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }  

        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
        }  

        public Map<String, Collection<String>> getCompanyMap() {
            return this.companyMap;
        }  

    }  

    package shuai.study.sax.demo;  

    import java.io.File;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;  

    /**
     * @author shengshu
     *
     */
    public class SaxDemo {
        public static void displayCompany(Map<String, Collection<String>> companyMap) {
            Iterator<Entry<String, Collection<String>>> companyIterator = companyMap.entrySet().iterator();  

            while (companyIterator.hasNext()) {
                Entry<String, Collection<String>> companyEntry = companyIterator.next();  

                String id = companyEntry.getKey();
                System.out.println("============== Employee ID " + id + " Start ==============");  

                Collection<String> employeeCollection = companyEntry.getValue();
                Iterator<String> employeeIterator = employeeCollection.iterator();  

                while (employeeIterator.hasNext()) {
                    String leafNodeAndValue = employeeIterator.next();
                    System.out.println(leafNodeAndValue);
                }  

                System.out.println("============== Employee ID " + id + " End ==============");
            }
        }  

        public static void main(String[] args) {
            String inputFilePath = SaxDemo.class.getResource("/file/input/company.xml").getPath();
            File inputFile = new File(inputFilePath);  

            SaxHandler saxHandler = new SaxHandler(inputFile);  

            Map<String, Collection<String>> companyMap = saxHandler.getCompanyMap();  

            SaxDemo.displayCompany(companyMap);
        }
    }  

    <?xml version = "1.0" encoding="UTF-8"?>  

    <Company>
        <Employee ID="37">
            <Name>
                <FirstName>Zhou</FirstName>
                <LastName>Shengshuai</LastName>
            </Name>  

            <Sex>Male</Sex>  

            <Address>
                <Country>China</Country>
                <Province>ShanDong</Province>
                <City>LinYi</City>
                <Village>FengHuangYu</Village>  

                <Contact>
                    <Mobile>18108***778</Mobile>
                    <Mail>zhoushengshuai2007@163.com</Mail>
                    <QQ>254392398</QQ>
                    <Postcode>276422</Postcode>
                </Contact>
            </Address>  

            <Profession>Software</Profession>
        </Employee>  

        <Employee ID="66">
            <Name>
                <FirstName>Wang</FirstName>
                <LastName>Eric</LastName>
            </Name>  

            <Sex>Male</Sex>  

            <Address>
                <Country>China</Country>
                <Province>HeBei</Province>
                <City>QinHuangDao</City>
                <Village>hhh</Village>  

                <Contact>
                    <Mobile>150*****955</Mobile>
                    <Mail>eric@163.com</Mail>
                    <QQ>666666666</QQ>
                    <Postcode>111666</Postcode>
                </Contact>
            </Address>  

            <Profession>Software</Profession>
        </Employee>  

        <Employee ID="99">
            <Name>
                <FirstName>Shi</FirstName>
                <LastName>Stone</LastName>
            </Name>  

            <Sex>Male</Sex>  

            <Address>
                <Country>China</Country>
                <Province>HeNan</Province>
                <City>PingDingShan</City>
                <Village>nnn</Village>  

                <Contact>
                    <Mobile>186*****015</Mobile>
                    <Mail>stone@163.com</Mail>
                    <QQ>999999999</QQ>
                    <Postcode>111999</Postcode>
                </Contact>
            </Address>  

            <Profession>Software</Profession>
        </Employee>
    </Company>  
时间: 2024-08-01 15:49:04

SAX 解析到文件,缓存到内存的相关文章

Android中使用sax解析xml文件的方法_Android

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument():当遇到文档的开头的时候,调用

PHP中文件缓存转内存缓存的方法_php技巧

前言 顾名思义文件缓存转内存缓存就是将存储在文件中的数据转到内存中去,实现磁盘操作转为内存操作,这样可以大大提高数据访问速度,并能实现缓存数据的分布式部署.文件缓存与内存缓存的介绍请参考名词解释部分. 原理 文件缓存转内存缓存的原理就是把文件缓存中的数据转存到内存中,以实现数据全局共享,解决频繁加载文件和装载数据的问题,采用Memcache工具实现内存缓存数据. 实现机制与步骤 1,检查文件是否存在内存缓存,如果不存在加载缓存文件 2,加载缓存文件,并获取缓存文件中的数据 3,将缓存文件中的数据

SAX解析XML文件

就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方式便于对XML节点的添加修改等,而且解析也很方便,然后它比较耗费内存,解析速度也不快.SAX则是基于事件的解析,解析器在一次读取XML文件中根据读取的数据产生相应的事件,由应用程序实现相应的事件处理逻辑,即它是一种"推"的解析方式:这种解析方法速度快.占用内存少,但是它需要应用程序自己处理

详解android使用SAX解析XML文件_Android

解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了. 优点:整个文档读入内存,方便操作:支持修改.删除和重现排列等多种功能. 缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间. 使用场合:一旦读入文档,还需要多次对文档进行操作,并且在硬件资源充足的情况下(内存,CPU). 为了解决DOM解析存在的问题,就出现了SAX解析.其特点为: 优点:不

一个关于用sax解析xml文件的问题

问题描述 就是解析不出来不知道出了什么问题???myHandler文件importjava.util.ArrayList;importjava.util.List;importorg.xml.sax.Attributes;importorg.xml.sax.SAXException;importorg.xml.sax.helpers.DefaultHandler;publicclassMyhandlerextendsDefaultHandler{privateList<Person>list;

详解Android之解析XML文件三种方式(DOM,PULL,SAX)

1.xml文件代码 <?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core

深入浅出如何解析xml文件---下篇

    在上篇博文中,小编主要介绍xml的两种解析方式,分别是dom4j和dom,今天这篇博文,小编主要来简单介绍一下xml的其她两种解析方式sax和jdom.     sax解析xml文件     sax,全称是Simple API for XML ,即是一种接口,也是一种软件包,她也是一种xml解析的替代方法,sax不同于dom解析,她逐行扫描文档,一边扫描一边解析,由于应用程序只是在读取数据时检查数据,因为不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势.     sax这种处理

Android使用SAX解析XML

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument() 当遇到文档的开头的时候,调用这

PHP文件缓存类实现代码_php技巧

php中缓存分类数据库缓存,文件缓存和内存缓存,下面我来给各位同学详细介绍PHP文件缓存类实现代码,有需要了解的朋友可参考.页面缓存类 代码如下 : <?php /*include( "cache.php" ); $cache = new cache(30); $cache->cacheCheck(); echo date("Y-m-d H:i:s"); $cache->caching(); */ class cache { //缓存目录 var