国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android開發中解析xml文件XmlUtils工具類與用法示例

2019-10-22 18:17:23
字體:
來源:轉載
供稿:網友

本文實例講述了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程序設計有所幫助。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 内江市| 中阳县| 青海省| 盱眙县| 梁河县| 石渠县| 大名县| 丽江市| 大余县| 麻江县| 体育| 巨鹿县| 三江| 寿阳县| 长沙市| 蓝山县| 灵川县| 库伦旗| 岗巴县| 启东市| 灵武市| 万年县| 海原县| 潍坊市| 绥阳县| 探索| 东台市| 呼玛县| 永城市| 迁西县| 南昌县| 丹江口市| 乐平市| 敖汉旗| 盈江县| 襄樊市| 镇坪县| 顺昌县| 成都市| 互助| 互助|