XML解析 反射成为对象

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

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

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

还算通用。

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

  1. package com.popo;
  2.  
  3. import java.lang.reflect.Array;
  4. import java.lang.reflect.Constructor;
  5. import java.lang.reflect.Field;
  6. import java.lang.reflect.InvocationTargetException;
  7. import java.util.ArrayList;
  8. import java.util.Arrays;
  9. import java.util.HashMap;
  10. import java.util.Iterator;
  11. import java.util.List;
  12. import java.util.Set;
  13.  
  14. /**
  15. *
  16. * @author liboliu
  17. *
  18. */
  19. public class Data {
  20. public String name = null;
  21. public String data = null;
  22. public HashMap<String,String> attr = null;
  23. public HashMap<String,ArrayList<Data>> son = null;
  24.  
  25. public ArrayList<Data> getSonData(String key) {
  26. return (ArrayList<Data>) (son == null ? son : son.get(key));
  27. }
  28.  
  29. public Object getAttr(String key) {
  30. return attr.get(key);
  31. }
  32.  
  33. public Data getSon(String key) {
  34. ArrayList<Data> sondata = son.get(key);
  35. return sondata.get(0);
  36. }
  37.  
  38. public Data getSon(String key,int index) {
  39. ArrayList<Data> sondata = son.get(key);
  40. return sondata.get(index);
  41. }
  42.  
  43. // //对象翻译为XML
  44. @Override
  45. public String toString() {
  46. // TODO Auto-generated method stub
  47. StringBuilder sb = new StringBuilder();
  48. // node名字
  49. sb.append("<" + name + "");
  50. if (attr != null) {
  51. Set<String> keys = attr.keySet();
  52. Iterator<String> it = keys.iterator();
  53. while (it.hasNext()) {
  54. String key_ = it.next();
  55. sb.append(" " + key_ + "=" + attr.get(key_) + " ");
  56.  
  57. }
  58. }
  59.  
  60. sb.append(" >\n");
  61. if (son != null) {
  62. Set<String> keys = son.keySet();
  63. Iterator<String> it = keys.iterator();
  64. while (it.hasNext()) {
  65. String key_ = it.next();
  66. ArrayList<Data> sonData = son.get(key_);
  67. for (Data d : sonData) {
  68. sb.append(d);
  69. }
  70.  
  71. }
  72. }
  73.  
  74. if (data != null) {
  75. sb.append(data + "\n");
  76. }
  77. // 结束
  78. sb.append("</" + name + ">\n");
  79. return sb.toString();
  80. }
  81.  
  82. @SuppressWarnings("unchecked")
  83. public <T> T toObject(Class<T> clazz,Object parent)
  84. throws InstantiationException,IllegalAccessException,SecurityException,NegativeArraySizeException,ClassNotFoundException,IllegalArgumentException,InvocationTargetException {
  85.  
  86. String name = clazz.getName();
  87. T o = null;
  88. if (name.contains("$")) {
  89. Constructor<?> constructor = (clazz.getConstructors())[0];
  90. o = (T) constructor.newInstance(parent);
  91.  
  92. } else {
  93. if(!isBaseType(clazz))
  94. o = clazz.newInstance();
  95. }
  96. if (attr != null) {
  97. Set<String> keys = attr.keySet();
  98. for (String key : keys) {
  99. String value = attr.get(key);
  100. if (value == null)
  101. continue;
  102. setValue(o,clazz,key,value);
  103. }
  104. }
  105. if (son != null) {
  106. Set<String> sonKeys = son.keySet();
  107. for (String sonKey : sonKeys) {
  108. Field sonField = null;
  109. try {
  110. sonField = clazz.getField(sonKey);
  111. } catch (NoSuchFieldException e) {
  112. // TODO Auto-generated catch block
  113. e.printStackTrace();
  114. }
  115. if (sonField == null)
  116. continue;
  117. ArrayList<Data> sonList = son.get(sonKey);
  118. String className = sonField.getType().getName();
  119. if (className.startsWith("[L")) {
  120. int size = sonList.size();
  121. String sonFieldClassName = className.substring(2,className.length() - 1);
  122. Object[] sonArray = (Object[]) Array.newInstance(
  123. Class.forName(sonFieldClassName),size);
  124. for (int i = 0; i < size; i++) {
  125. sonArray[i] = sonList.get(i).toObject(
  126. Class.forName(sonFieldClassName),o);
  127. }
  128. sonField.set(o,sonArray);
  129. } else {
  130. Data sonData = sonList.get(0);
  131. Object sonObject = sonData.toObject(sonField.getType(),o);
  132. if (sonObject != null) {
  133. sonField.set(o,sonObject);
  134. }
  135. }
  136.  
  137. }
  138. }
  139.  
  140. if (data != null) {
  141. Field sonField = null;
  142. if (attr == null || attr.size() == 0) {
  143. if (isBaseType(clazz)) {
  144. try {
  145. sonField = parent.getClass().getField(this.name);
  146. if (sonField != null) {
  147. setValue(parent,parent.getClass(),this.name,data);
  148. }
  149. } catch (NoSuchFieldException e) {
  150. // TODO Auto-generated catch block
  151. e.printStackTrace();
  152. }
  153.  
  154. return null;
  155. }
  156. }
  157. try {
  158. sonField = clazz.getField(name);
  159. } catch (NoSuchFieldException e) {
  160. // TODO Auto-generated catch block
  161. e.printStackTrace();
  162. }
  163. if (sonField != null) {
  164. setValue(o,name,data);
  165. }
  166.  
  167. }
  168. return o;
  169. }
  170.  
  171. public <T> boolean isBaseType(Class<T> clazz) {
  172. if (clazz == String.class || clazz == Integer.TYPE
  173. || clazz == Float.TYPE || clazz == Double.TYPE
  174. || clazz == Long.TYPE || clazz == Short.TYPE
  175. || clazz == Byte.TYPE || clazz == Character.TYPE) {
  176. return true;
  177. } else {
  178. return false;
  179. }
  180.  
  181. }
  182.  
  183. private void setValue(Object p,Class clazz,String ff,String data2)
  184. throws SecurityException,IllegalAccessException {
  185. // TODO Auto-generated method stub
  186.  
  187. Field f = null;
  188. try {
  189. f = clazz.getField(ff);
  190. } catch (NoSuchFieldException e) {
  191. // TODO Auto-generated catch block
  192. e.printStackTrace();
  193. }
  194. if (f == null)
  195. return;
  196. Class<?> t = f.getType();
  197.  
  198. if (t == String.class) {
  199. f.set(p,data2);
  200. } else if (t == Integer.TYPE) {
  201. f.set(p,Integer.parseInt(data2));
  202. } else if (t == Float.TYPE) {
  203. f.set(p,Float.parseFloat(data2));
  204. } else if (t == Double.TYPE) {
  205. f.set(p,Double.parseDouble(data2));
  206. } else if (t == Long.TYPE) {
  207. f.set(p,Long.parseLong(data2));
  208. } else if (t == Short.TYPE) {
  209. f.set(p,Short.parseShort(data2));
  210. } else if (t == Boolean.TYPE) {
  211. f.set(p,Boolean.parseBoolean(data2));
  212. } else if(t==Byte.TYPE) {
  213. f.set(p,Byte.parseByte(data2));
  214. }else{
  215. f.set(p,data2);
  216. }
  217.  
  218. }
  219.  
  220. }



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

  1. public Data parXml(InputStream in) throws XmlPullParserException {
  2. LinkedList<Data> stack = null;
  3.  
  4. Data parent = null;
  5. Data self = null;
  6. Data root = null;
  7. String rootTag=null;
  8. try {
  9.  
  10. XmlPullParserFactory f = XmlPullParserFactory.newInstance();
  11. f.setNamespaceAware(true);
  12. XmlPullParser xmlPullParser = f.newPullParser();
  13.  
  14. xmlPullParser.setInput(new InputStreamReader(in));
  15. StringBuilder tab = new StringBuilder();
  16. int eventType = xmlPullParser.getEventType();
  17. while (eventType != XmlPullParser.END_DOCUMENT) {
  18. if (eventType == XmlPullParser.START_DOCUMENT) {
  19. root = new Data();
  20. stack = new LinkedList<Data>();
  21. stack.addFirst(root);
  22. } else if (eventType == XmlPullParser.START_TAG) {
  23. self = new Data();
  24. self.name = xmlPullParser.getName();
  25. if(rootTag==null)
  26. rootTag=self.name;
  27. parent = stack.peekFirst();
  28. stack.addFirst(self);
  29. addSelfInParent(self,parent,xmlPullParser.getName());
  30. int count = xmlPullParser.getAttributeCount();
  31. if (count > 0) {
  32. self.attr = new HashMap<String,String>();
  33. for (int i = 0; i < count; i++) {
  34.  
  35. self.attr.put(xmlPullParser.getAttributeName(i),xmlPullParser.getAttributeValue(i));
  36. }
  37.  
  38. }
  39.  
  40. } else if (eventType == XmlPullParser.END_TAG) {
  41. stack.removeFirst();
  42. self = stack.getFirst();
  43. } else if (eventType == XmlPullParser.TEXT) {
  44. if (self != null)
  45. self.data = xmlPullParser.getText();
  46. }
  47. try {
  48. eventType = xmlPullParser.next();
  49. } catch (IOException e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. }
  53. }
  54. stack = null;
  55. parent = null;
  56. self = null;
  57.  
  58. } catch (XmlPullParserException e) {
  59. // TODO Auto-generated catch block
  60. e.printStackTrace();
  61. }
  62.  
  63. return root.getSon(rootTag);
  64. }

使用方法小例子

  1. new Thread() {
  2. public void run() {
  3. URL url;
  4. try {
  5. url = new URL(
  6. "http://www.w3school.com.cn/example/xmle/plant_catalog.xml");
  7. InputStream in = url.openConnection().getInputStream();
  8. Data d = parXml(in);
  9. Catalog p = d.toObject(Catalog.class,null);
  10. Log.v("helll","xixix");
  11. } catch (MalformedURLException e) {
  12. // TODO Auto-generated catch block
  13. e.printStackTrace();
  14. } catch (IOException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. } catch (XmlPullParserException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. } catch (SecurityException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. } catch (NegativeArraySizeException e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. } catch (IllegalArgumentException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. } catch (InstantiationException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. } catch (IllegalAccessException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. } catch (ClassNotFoundException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. } catch (InvocationTargetException e) {
  39. // TODO Auto-generated catch block
  40. e.printStackTrace();
  41. }
  42.  
  43. };
  44. }.start();

反射的对象解构

  1. public class Catalog {
  2. public Plant[] PLANT;
  3. public class Plant {
  4. public String COMMON;
  5. public String BOTANICAL;
  6. public String ZONE;
  7. public String LIGHT;
  8. public String PRICE;
  9. public String AVAILABILITY;
  10. }
  11. }

猜你在找的XML相关文章