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