本文實例講述了Android開發中解析xml文件XmlUtils工具類與用法。分享給大家供大家參考,具體如下:
1. xmlUtil工具類
package com.example.xmlpaserutil.util;import java.io.InputStream;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import android.util.Log;import android.util.Xml;public class XmlUtil<T> {/*** 解析XML轉換成對象** @param is* 輸入流* @param clazz* 對象Class* @param fields* 字段集合一一對應節點集合* @param elements //d(這兩行標紅,是因為這兩個是java中字段和xml文件中的字段對應)隊醫* 節點集合一一對應字段集合* @param itemElement* 每一項的節點標簽* @return*///靜態方法中加入泛型,需要申明<T>,如果不是對泛型不是很熟悉,可以先用Object代替,然后再換回來public static <T> List<T> parse(InputStream is, Class<T> clazz,List<String> fields, List<String> elements, String itemElement) {Log.v("rss", "開始解析XML.");List<T> list = new ArrayList<T>();try {XmlPullParser xmlPullParser = Xml.newPullParser();xmlPullParser.setInput(is, "UTF-8");int event = xmlPullParser.getEventType();T obj = null;while (event != XmlPullParser.END_DOCUMENT) {switch (event) {case XmlPullParser.START_TAG:if (itemElement.equals(xmlPullParser.getName())) {obj = clazz.newInstance();}if (obj != null&& elements.contains(xmlPullParser.getName())) {setFieldValue(obj, fields.get(elements.indexOf(xmlPullParser.getName())),xmlPullParser.nextText());}break;case XmlPullParser.END_TAG:if (itemElement.equals(xmlPullParser.getName())) {list.add(obj);obj = null;}break;}event = xmlPullParser.next();}} catch (Exception e) {Log.e("rss", "解析XML異常:" + e.getMessage());throw new RuntimeException("解析XML異常:" + e.getMessage());}return list;}/*** 設置字段值** @param propertyName* 字段名* @param obj* 實例對象* @param value* 新的字段值* @return*/public static void setFieldValue(Object obj, String propertyName,Object value) {try {Field field = obj.getClass().getDeclaredField(propertyName);field.setAccessible(true);field.set(obj, value);} catch (Exception ex) {throw new RuntimeException();}}}2. MainActivity的調用
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);InputStream in = null;try {in =getResources().getAssets().open("User.xml");//如果說要獲取到File對象的話,獲取assert文件中的文件//File file =new File("file:///android_asset/User.xml");} catch (Exception e) {e.printStackTrace();}List <String > fields =new ArrayList<String>();List <String > elements =new ArrayList<String>();fields.add("name");fields.add("age");elements.add("name");elements.add("age");List<User> users = XmlUtil.parse(in, User.class, fields, elements, "User");for (Object object : users) {System.out.println(object.toString());}}3. xlm文件中的寫法(這里解析出來是一個集合)
<?xml version="1.0" encoding="UTF-8"?><Users> <User> <name>張三</name> <age>20</age> </User> <User> <name>李四</name> <age>21</age> </User> <User> <name>王五</name> <age>22</age> </User></Users>
這里是我參考的
/** * 解析XML工具類 */public class XmlUtils { /** * 解析XML轉換成對象 * * @param is * 輸入流 * @param clazz * 對象Class * @param fields * 字段集合一一對應節點集合 * @param elements * 節點集合一一對應字段集合 * @param itemElement * 每一項的節點標簽 * @return */ public static List<Object> parse(InputStream is, Class<?> clazz, List<String> fields, List<String> elements, String itemElement) { Log.v("rss", "開始解析XML."); List<Object> list = new ArrayList<Object>(); try { XmlPullParser xmlPullParser = Xml.newPullParser(); xmlPullParser.setInput(is, "UTF-8"); int event = xmlPullParser.getEventType(); Object obj = null; while (event != XmlPullParser.END_DOCUMENT) { switch (event) { case XmlPullParser.START_TAG: if (itemElement.equals(xmlPullParser.getName())) { obj = clazz.newInstance(); } if (obj != null && elements.contains(xmlPullParser.getName())) { setFieldValue(obj, fields.get(elements .indexOf(xmlPullParser.getName())), xmlPullParser.nextText()); } break; case XmlPullParser.END_TAG: if (itemElement.equals(xmlPullParser.getName())) { list.add(obj); obj = null; } break; } event = xmlPullParser.next(); } } catch (Exception e) { Log.e("rss", "解析XML異常:" + e.getMessage()); throw new RuntimeException("解析XML異常:" + e.getMessage()); } return list; } /** * 設置字段值 * * @param propertyName * 字段名 * @param obj * 實例對象 * @param value * 新的字段值 * @return */ public static void setFieldValue(Object obj, String propertyName, Object value) { try { Field field = obj.getClass().getDeclaredField(propertyName); field.setAccessible(true); field.set(obj, value); } catch (Exception ex) { throw new RuntimeException(); } }}實體:
public class User{ private String name; private String age; get...set...}XML:
<Users> <User> <name>張三</name> <age>20</age> </User> <User> <name>李四</name> <age>21</age> </User> <User> <name>王五</name> <age>22</age> </User></Users>
對應的參數:
/*** 解析XML轉換成對象** @param is* 輸入流,這個就是XML文件的流* @param clazz* 對象Class,User類的class* @param fields* 字段集合一一對應節點集合,例如這個類就有兩個字段,name和age,放入 List中,放入的位置要和下面的XML節點的位置一一對應,List<String> fields = new ArrayList<String>();fields.add("name");fields.add("age");* @param elements* 節點集合一一對應字段集合,例如這個XML有兩個屬性,name和age,放入List中,放入的位置要和上面的實體屬性的位置一一對應,List<String> elements = new ArrayList<String>();fields.add("name");fields.add("age");* @param itemElement* 每一項的節點標簽,在XML中按哪個節點當成一組,這里是User* @return*/希望本文所述對大家Android程序設計有所幫助。
新聞熱點
疑難解答