目的
通过一个小的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>