XML解析 反射成为对象

来源:互联网 发布:阿里云免费体验邀请码 编辑:程序博客网 时间:2024/05/01 19:08

前一阵做了一个XML解析方法,是使用SAX和XMLPull解析xml为一个类似于Dom节点的对象。解析式成功的但是发现使用起来不是很方便,于是乎对Data增加了

几个获取子节点和属性的方法,修改完后用起来还算方便。后来想增加一个XML映射成对象的方法,在网上找了些都不够通用,于是乎自己写了一个映射方法,

还算通用。

首先贴下 Data对象 这个是xml解析后的结果对象

package com.popo;import java.lang.reflect.Array;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Set;/** *  * @author liboliu *  */public class Data {public String name = null;public String data = null;public HashMap<String, String> attr = null;public HashMap<String, ArrayList<Data>> son = null;public ArrayList<Data> getSonData(String key) {return (ArrayList<Data>) (son == null ? son : son.get(key));}public Object getAttr(String key) {return attr.get(key);}public Data getSon(String key) {ArrayList<Data> sondata = son.get(key);return sondata.get(0);}public Data getSon(String key, int index) {ArrayList<Data> sondata = son.get(key);return sondata.get(index);}// //对象翻译为XML@Overridepublic String toString() {// TODO Auto-generated method stubStringBuilder sb = new StringBuilder();// node名字sb.append("<" + name + "");if (attr != null) {Set<String> keys = attr.keySet();Iterator<String> it = keys.iterator();while (it.hasNext()) {String key_ = it.next();sb.append(" " + key_ + "=" + attr.get(key_) + " ");}}sb.append(" >\n");if (son != null) {Set<String> keys = son.keySet();Iterator<String> it = keys.iterator();while (it.hasNext()) {String key_ = it.next();ArrayList<Data> sonData = son.get(key_);for (Data d : sonData) {sb.append(d);}}}if (data != null) {sb.append(data + "\n");}// 结束sb.append("</" + name + ">\n");return sb.toString();}@SuppressWarnings("unchecked")public <T> T toObject(Class<T> clazz, Object parent)throws InstantiationException, IllegalAccessException,SecurityException, NegativeArraySizeException,ClassNotFoundException, IllegalArgumentException,InvocationTargetException {String name = clazz.getName();T o = null;if (name.contains("$")) {Constructor<?> constructor = (clazz.getConstructors())[0];o = (T) constructor.newInstance(parent);} else {if(!isBaseType(clazz))o = clazz.newInstance();}if (attr != null) {Set<String> keys = attr.keySet();for (String key : keys) {String value = attr.get(key);if (value == null)continue;setValue(o, clazz, key, value);}}if (son != null) {Set<String> sonKeys = son.keySet();for (String sonKey : sonKeys) {Field sonField = null;try {sonField = clazz.getField(sonKey);} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (sonField == null)continue;ArrayList<Data> sonList = son.get(sonKey);String className = sonField.getType().getName();if (className.startsWith("[L")) {int size = sonList.size();String sonFieldClassName = className.substring(2,className.length() - 1);Object[] sonArray = (Object[]) Array.newInstance(Class.forName(sonFieldClassName), size);for (int i = 0; i < size; i++) {sonArray[i] = sonList.get(i).toObject(Class.forName(sonFieldClassName), o);}sonField.set(o, sonArray);} else {Data sonData = sonList.get(0);Object sonObject = sonData.toObject(sonField.getType(), o);if (sonObject != null) {sonField.set(o, sonObject);}}}}if (data != null) {Field sonField = null;if (attr == null || attr.size() == 0) {if (isBaseType(clazz)) {try {sonField = parent.getClass().getField(this.name);if (sonField != null) {setValue(parent, parent.getClass(), this.name, data);}} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}try {sonField = clazz.getField(name);} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (sonField != null) {setValue(o, clazz, name, data);}}return o;}public <T> boolean isBaseType(Class<T> clazz) {if (clazz == String.class || clazz == Integer.TYPE|| clazz == Float.TYPE || clazz == Double.TYPE|| clazz == Long.TYPE || clazz == Short.TYPE|| clazz == Byte.TYPE || clazz == Character.TYPE) {return true;} else {return false;}}private void setValue(Object p, Class clazz, String ff, String data2)throws SecurityException, IllegalArgumentException,IllegalAccessException {// TODO Auto-generated method stubField f = null;try {f = clazz.getField(ff);} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (f == null)return;Class<?> t = f.getType();if (t == String.class) {f.set(p, data2);} else if (t == Integer.TYPE) {f.set(p, Integer.parseInt(data2));} else if (t == Float.TYPE) {f.set(p, Float.parseFloat(data2));} else if (t == Double.TYPE) {f.set(p, Double.parseDouble(data2));} else if (t == Long.TYPE) {f.set(p, Long.parseLong(data2));} else if (t == Short.TYPE) {f.set(p, Short.parseShort(data2));} else if (t == Boolean.TYPE) {f.set(p, Boolean.parseBoolean(data2));} else if(t==Byte.TYPE) {f.set(p, Byte.parseByte(data2));}else{f.set(p, data2);}}}



然后贴下使用XmlPull解析的例子

public Data parXml(InputStream in) throws XmlPullParserException {LinkedList<Data> stack = null;Data parent = null;Data self = null;Data root = null;String rootTag=null;try {XmlPullParserFactory f = XmlPullParserFactory.newInstance();f.setNamespaceAware(true);XmlPullParser xmlPullParser = f.newPullParser();xmlPullParser.setInput(new InputStreamReader(in));StringBuilder tab = new StringBuilder();int eventType = xmlPullParser.getEventType();while (eventType != XmlPullParser.END_DOCUMENT) {if (eventType == XmlPullParser.START_DOCUMENT) {root = new Data();stack = new LinkedList<Data>();stack.addFirst(root);} else if (eventType == XmlPullParser.START_TAG) {self = new Data();self.name = xmlPullParser.getName();if(rootTag==null)rootTag=self.name;parent = stack.peekFirst();stack.addFirst(self);addSelfInParent(self, parent, xmlPullParser.getName());int count = xmlPullParser.getAttributeCount();if (count > 0) {self.attr = new HashMap<String, String>();for (int i = 0; i < count; i++) {self.attr.put(xmlPullParser.getAttributeName(i),xmlPullParser.getAttributeValue(i));}}} else if (eventType == XmlPullParser.END_TAG) {stack.removeFirst();self = stack.getFirst();} else if (eventType == XmlPullParser.TEXT) {if (self != null)self.data = xmlPullParser.getText();}try {eventType = xmlPullParser.next();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}stack = null;parent = null;self = null;} catch (XmlPullParserException e) {// TODO Auto-generated catch blocke.printStackTrace();}return root.getSon(rootTag);}

 

使用方法小例子

 

new Thread() {public void run() {URL url;try {url = new URL("http://www.w3school.com.cn/example/xmle/plant_catalog.xml");InputStream in = url.openConnection().getInputStream();Data d = parXml(in);Catalog p = d.toObject(Catalog.class, null);Log.v("helll","xixix");} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (XmlPullParserException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NegativeArraySizeException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}};}.start();

反射的对象解构

public class Catalog {public Plant[]   PLANT;public class Plant {public String COMMON;public String BOTANICAL;public String ZONE;public String LIGHT;public String PRICE;public String AVAILABILITY;}}



 

原创粉丝点击