Android开发中解析xml文件XmlUtils工具类与用法示例
本文实例讲述了Android开发中解析xml文件XmlUtils工具类与用法。分享给大家供大家参考,具体如下:
1.xmlUtil工具类
packagecom.example.xmlpaserutil.util; importjava.io.InputStream; importjava.lang.reflect.Field; importjava.util.ArrayList; importjava.util.List; importorg.xmlpull.v1.XmlPullParser; importandroid.util.Log; importandroid.util.Xml; publicclassXmlUtil{ /** *解析XML转换成对象 * *@paramis *输入流 *@paramclazz *对象Class *@paramfields *字段集合一一对应节点集合 *@paramelements//d(这两行标红,是因为这两个是java中字段和xml文件中的字段对应)队医 *节点集合一一对应字段集合 *@paramitemElement *每一项的节点标签 *@return */ //静态方法中加入泛型,需要申明 ,如果不是对泛型不是很熟悉,可以先用Object代替,然后再换回来 publicstatic List parse(InputStreamis,Class clazz, List fields,List elements,StringitemElement){ Log.v("rss","开始解析XML."); List list=newArrayList (); try{ XmlPullParserxmlPullParser=Xml.newPullParser(); xmlPullParser.setInput(is,"UTF-8"); intevent=xmlPullParser.getEventType(); Tobj=null; while(event!=XmlPullParser.END_DOCUMENT){ switch(event){ caseXmlPullParser.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; caseXmlPullParser.END_TAG: if(itemElement.equals(xmlPullParser.getName())){ list.add(obj); obj=null; } break; } event=xmlPullParser.next(); } }catch(Exceptione){ Log.e("rss","解析XML异常:"+e.getMessage()); thrownewRuntimeException("解析XML异常:"+e.getMessage()); } returnlist; } /** *设置字段值 * *@parampropertyName *字段名 *@paramobj *实例对象 *@paramvalue *新的字段值 *@return */ publicstaticvoidsetFieldValue(Objectobj,StringpropertyName, Objectvalue){ try{ Fieldfield=obj.getClass().getDeclaredField(propertyName); field.setAccessible(true); field.set(obj,value); }catch(Exceptionex){ thrownewRuntimeException(); } } }
2.MainActivity的调用
@Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); InputStreamin=null; try{ in=getResources().getAssets().open("User.xml"); //如果说要获取到File对象的话,获取assert文件中的文件 //Filefile=newFile("file:///android_asset/User.xml"); }catch(Exceptione){ e.printStackTrace(); } Listfields=newArrayList (); List elements=newArrayList (); fields.add("name"); fields.add("age"); elements.add("name"); elements.add("age"); List users=XmlUtil.parse(in,User.class,fields,elements,"User"); for(Objectobject:users){ System.out.println(object.toString()); } }
3.xlm文件中的写法(这里解析出来是一个集合)
张三 20 李四 21 王五 22
这里是我参考的
/** *解析XML工具类 */ publicclassXmlUtils{ /** *解析XML转换成对象 * *@paramis *输入流 *@paramclazz *对象Class *@paramfields *字段集合一一对应节点集合 *@paramelements *节点集合一一对应字段集合 *@paramitemElement *每一项的节点标签 *@return */ publicstaticList
实体:
publicclassUser{ privateStringname; privateStringage; get...set... }
XML:
张三 20 李四 21 王五 22
对应的参数:
/** *解析XML转换成对象 * *@paramis *输入流,这个就是XML文件的流 *@paramclazz *对象Class,User类的class *@paramfields *字段集合一一对应节点集合,例如这个类就有两个字段,name和age,放入List中,放入的位置要和下面的XML节点的位置一一对应, Listfields=newArrayList (); fields.add("name"); fields.add("age"); *@paramelements *节点集合一一对应字段集合,例如这个XML有两个属性,name和age,放入List中,放入的位置要和上面的实体属性的位置一一对应, List elements=newArrayList (); fields.add("name"); fields.add("age"); *@paramitemElement *每一项的节点标签,在XML中按哪个节点当成一组,这里是User *@return */
PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线