java中使用sax解析xml,以实体类集合的方式接受xml解析的值

来源:互联网 发布:tensorflow 谷歌 编辑:程序博客网 时间:2024/05/17 02:39

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

0 0
原创粉丝点击