1. 程式人生 > >java中使用sax解析xml,以實體類集合的方式接受xml解析的值

java中使用sax解析xml,以實體類集合的方式接受xml解析的值

1.先編寫要解析的xml檔案:

<?xml version="1.0" encoding="utf-8"?>
<class>
<stu id="001">
<name>Allen</name>
<sex>男</sex>
<age>20</age>
</stu>
<stu id="002">
<name>namy</name>
<sex>女</sex>
<age>18</age>
</stu>
<stu id="003">
<name>lufy</name>
<sex>男</sex>
<age>19</age>
</stu>
</class>


2.編寫要轉換的實體類:PersonBean

package com.xml.util;

public class PersonBean {
	
	private String name;
	private String sex;
	private String age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	
	

}


3.編寫xml解析檔案繼承DefaultHandler

/**
 * 用SAX解析XML的Handler
 */
package com.xml.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Myhandler extends DefaultHandler {
    //儲存正在解析的元素的資料
    private Map<String,String> map=null;
    //儲存所有解析的元素的資料
    private List<Map<String,String>> list=null;
    private List<PersonBean> personList =null;
    PersonBean person =null;
    //正在解析的元素的名字
    String currentTag=null;
    //正在解析的元素的元素值
    String currentValue=null;
    //開始解析的元素
    String nodeName=null;
    

    public Myhandler(String nodeName) {
        this.nodeName=nodeName;
    }
    
    public List<Map<String, String>> getList() {
        return list;
    }
    
    public List<PersonBean> getPersonList(){
    	return personList;
    }

    //開始解析文件,即開始解析XML根元素時呼叫該方法
    @Override
    public void startDocument() throws SAXException {
        System.out.println("--startDocument()--");
        //初始化Map
        list=new ArrayList<Map<String,String>>();
        personList=new ArrayList<PersonBean>();
    }
    
    //開始解析每個元素時都會呼叫該方法
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        //判斷正在解析的元素是不是開始解析的元素
        System.out.println("--startElement()--"+qName);
        if(qName.equals(nodeName)){
            map=new HashMap<String, String>();
            person=new PersonBean();
        }
        
        //判斷正在解析的元素是否有屬性值,如果有則將其全部取出並儲存到map物件中,如:<person id="00001"></person>
        if(attributes!=null&&map!=null){
            for(int i=0;i<attributes.getLength();i++){
                map.put(attributes.getQName(i), attributes.getValue(i));
            }
        }
        currentTag=qName;  //正在解析的元素
    }
    
    //解析到每個元素的內容時會呼叫此方法
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        System.out.println("--characters()--");
        if(currentTag!=null&&map!=null){
            currentValue=new String(ch,start,length);
            //如果內容不為空和空格,也不是換行符則將該元素名和值和存入map中
            if(currentValue!=null&&!currentValue.trim().equals("")&&!currentValue.trim().equals("\n")){
                map.put(currentTag, currentValue);
                Field[] allFields = PersonBean.class.getDeclaredFields();
                for (int i = 0; i < allFields.length; i++) {
    				if(allFields[i].getName().equals(currentTag)){
    					String firstLetter = allFields[i].getName().substring(0, 1)
    							.toUpperCase();
    					String setter = "set" + firstLetter
    							+ allFields[i].getName().substring(1);
    					try {
    						Method method = person.getClass().getMethod(setter,allFields[i].getType());
    							try {
    								method.invoke(person, currentValue);
    							} catch (IllegalArgumentException e) {
    								e.printStackTrace();
    							} catch (IllegalAccessException e) {
    								e.printStackTrace();
    							} catch (InvocationTargetException e) {
    								e.printStackTrace();
    							}
    					} catch (SecurityException e) {
    						e.printStackTrace();
    					} catch (NoSuchMethodException e) {
    						e.printStackTrace();
    					}
    				}
    			}
                System.out.println("-----"+currentTag+": "+currentValue);
            }
            //當前的元素已解析過,將其置空用於下一個元素的解析
            currentTag=null;
            currentValue=null;
        }
    }
    
    //每個元素結束的時候都會呼叫該方法
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("--endElement()--"+qName);
        //判斷是否為一個節點結束的元素標籤
        if(qName.equals(nodeName)){
            list.add(map);
            map=null;
        }
        if(qName.equals("age")){
        	personList.add(person);
        	person=null;
        }
    }
    
    //結束解析文件,即解析根元素結束標籤時呼叫該方法
    @Override
    public void endDocument() throws SAXException {
        System.out.println("--endDocument()--");
        super.endDocument();
    }
}


4.解析xml的方法

/**
 * 封裝解析業務類
 */
package com.xml.service;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import com.xml.util.Myhandler;
import com.xml.util.PersonBean;

public class SaxService {
    
    public static List<Map<String,String>> ReadXML(String uri,String NodeName){
        try {
            //建立一個解析XML的工廠物件
            SAXParserFactory parserFactory=SAXParserFactory.newInstance();
            //建立一個解析XML的物件
            SAXParser parser=parserFactory.newSAXParser();
            //建立一個解析助手類
            Myhandler myhandler=new Myhandler("stu");
            parser.parse(uri, myhandler);
            return myhandler.getList();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            
        }
        return null;
        
    }
    
    public static List<PersonBean> Read2XML(String uri,String NodeName){
        try {
            //建立一個解析XML的工廠物件
            SAXParserFactory parserFactory=SAXParserFactory.newInstance();
            //建立一個解析XML的物件
            SAXParser parser=parserFactory.newSAXParser();
            //建立一個解析助手類
            Myhandler myhandler=new Myhandler("stu");
            parser.parse(uri, myhandler);
            return myhandler.getPersonList();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            
        }
        return null;
        
    }
    
}


5.編寫main主方法呼叫解析程式碼:

/**
 * 程式入口
 */
package com.xml.sax;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.xml.service.SaxService;
import com.xml.util.PersonBean;

public class XmlSaxTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ArrayList<Map<String, String>> list=(ArrayList<Map<String, String>>) SaxService.ReadXML("D:\\Program Files\\DNA Workspace\\Test\\myClass.xml","class");
        /*for(int i=0;i<list.size();i++){
            HashMap<String, String> temp=(HashMap<String, String>) list.get(i);
                Iterator<String> iterator=temp.keySet().iterator();
                while(iterator.hasNext()){
                    String key=iterator.next().toString();
                    String value=temp.get(key);
                    System.out.print(key+" "+value+"--");
                }
        }*/
        List<PersonBean> personList =SaxService.Read2XML("D:\\Program Files\\DNA Workspace\\Test\\myClass.xml","class");
        System.out.println(list.toString());
        System.out.println("最新的xml解析:"+personList.toString());
    }

}

原始碼下載地址:http://download.csdn.net/detail/w2393040183/9582334