[代码] [Java]代码
view sourceprint?
001
package SAXparse;
002
003
004
import java.io.FileInputStream;
005
import java.lang.reflect.Array;
006
import java.lang.reflect.InvocationTargetException;
007
import java.lang.reflect.Method;
008
import java.text.ParseException;
009
import java.text.SimpleDateFormat;
010
import java.util.ArrayList;
011
import java.util.List;
012
013
import javax.sql.rowset.spi.XmlReader;
014
import javax.xml.parsers.ParserConfigurationException;
015
import javax.xml.parsers.SAXParser;
016
import javax.xml.parsers.SAXParserFactory;
017
018
import org.w3c.dom.Element;
019
import org.xml.sax.Attributes;
020
import org.xml.sax.InputSource;
021
import org.xml.sax.SAXException;
022
import org.xml.sax.XMLReader;
023
import org.xml.sax.helpers.DefaultHandler;
024
025
026
027
public class SaxParse {
028
029
public static void main(String[] args) throws Exception {
030
// TODO Auto-generated method stub
031
SAXParserFactory saxpf = SAXParserFactory.newInstance();
032
SAXParser saxp = saxpf.newSAXParser();
033
XMLReader reader = saxp.getXMLReader();
034
//这里不同于DOM解析式多了一个Handler 创建一个将要解析文件的Handler类继承 DefaultHandler
035
EmployeeHandler empHander = new EmployeeHandler();
036
reader.setContentHandler(empHander);
037
//set Handler
038
reader.parse(new InputSource(new FileInputStream("file/xml/employeelist.xml")));
039
//开始解析,SAX 开始解析的时候 就会自动调用 EmployeeHandler 中的方法 开始解析调用startDocument(),开始解析一个元素调用startElement()。
040
ArrayList<Employee> empList = empHander.getEmployeeList();
041
for(Employee emp:empList){
042
System.out.println(emp);
class EmployeeHandler extends DefaultHandler{
049
//EmployeeHandler 继承DefaultHandler 然后根据需要选择要重载的 方法
050http://www.huiyi8.com/moban/ 网页模板
// 这里我重载了 startDocument endDocument startElement endElement endElement characters
051
private ArrayList<Employee> employeeList = new ArrayList<Employee>();
052
//创建一个list 来保存解析出来的employee对象
053
@Override
054
public void startDocument() throws SAXException {
055
// TODO Auto-generated method stub
056
System.out.println("begin");
057
//开始解析 打印 begin
058
}
059
060
@Override
061
public void endDocument() throws SAXException {
062
// TODO Auto-generated method stub
063
System.out.println("end");
064
// 结束后打印end
065
}
066
067
private Employee emp =null;
068
private Class cls =null;
069
private String qName=null;
070
public void startElement(String uri, String localName, String qName,
071
Attributes attributes) throws SAXException {
072
// TODO Auto-generated method stub
073
this.qName =qName;
074
//在这里保存一下 元素的名称,在characters()有用到
075
try {
076
cls =Class.forName("SAXparse.Employee");
077
//反射机制
078
Method[] methods =cls.getMethods();
079
if(qName.equals("employee")||qName.equals("salary")){
080
//如果qName=employee 也就是解析到了 employee元素和salary 元素才继续
081
// 因为employee就是要建立的对象,每当解析到一个employee元素就创建一个employee对象
082
// salary 因为有属性所以也单独拿出来
083
if(emp==null){
084
//如果employee对象不存在 就创建
085
emp = (Employee) cls.newInstance();
086
System.out.println("创建一个emp对象");
087
}
088
for(Method me : methods){
089
String meName = me.getName();
090
if(meName.startsWith("set")){
091
String mName = meName.substring(3).toLowerCase();
092
Class[] parm = me.getParameterTypes();
093
String parma = parm[0].getName();
094
095
for(int i=0;i<attributes.getLength();i++){
096
String attrName = attributes.getQName(i);
097
//直接从函数参数中拿到attributes 这里也就是 SAX我感觉 比DOM 效率高的地方
098
//是顺序解析的。但是*度就没有DOM解析高了
099
String attrVal = attributes.getValue(i);
100
if(mName.equals(attrName.toLowerCase())){
101
if(parma.equals("java.lang.String")){
102
//吧属性set进emp对象中
103
me.invoke(emp,attrVal );