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 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>  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇