XML解析 反射成为对象

前端之家收集整理的这篇文章主要介绍了XML解析 反射成为对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前一阵做了一个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
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		StringBuilder 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 block
					e.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 block
						e.printStackTrace();
					}

					return null;
				}
			}
			try {
				sonField = clazz.getField(name);
			} catch (NoSuchFieldException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if (sonField != null) {
				setValue(o,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,IllegalAccessException {
		// TODO Auto-generated method stub

		Field f = null;
		try {
			f = clazz.getField(ff);
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.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 block
					e.printStackTrace();
				}
			}
			stack = null;
			parent = null;
			self = null;

		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.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 block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (XmlPullParserException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (SecurityException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (NegativeArraySizeException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (InstantiationException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					// TODO Auto-generated catch block
					e.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;
	}
}
原文链接:https://www.f2er.com/xml/300000.html

猜你在找的XML相关文章