您的位置:首页 > 编程语言 > Java开发

JAVA SAX解析XML文件

2014-07-02 12:42 337 查看
[代码] [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;

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

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 http://www.huiyi8.com/moban/ href="http://www.huiyi8.com/moban/" target=_blank>模板

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);

043

048

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对象");

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 );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: