目的
    通过一个小的SAX
例子,我们更清晰的
理解SAX的工作原理。
    本文例子主要实现:
    1. 将每个Employee信息输出到自己的文件中,
文件名是以Employee ID和Employee Name来命名的,注意,观察代码中是如何得到Employee ID和Employee Name;
    2. 将Employee的信息存入Map中,其中,Map中的每个Value对应一个Employee的Collection,Map中的每个Key对应该Employee的ID。
    交流方式:【E-Mail】 zhoushengshuai2007@163.com 【
QQ】 254392398 
class="java">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 = SaxDemo.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>