[代码] [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 http://www.huiyi8.com/moban/ html模板

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 然后根据需要选择要重载的 方法

050

//  这里我重载了 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对象");