Android解析XML,直接将XML转化为Bean,可用作地址选择器数据源
2017-10-17 12:52
876 查看
转载请标明出处:http://write.blog.csdn.net/postlist
现在Android开发中,基本都是JSON的解析,相对与XML的话比较方便。但是不可避免也会用到XML解析,Json解析相信大家都比较熟悉了,这里就不多介绍了 。Android 的XML解析三种方式Dom,Sax,Pull想必大家也都知道。如果内容比较少的话还可以
但是如果比较多,也比较复杂。就有点太繁琐了。
Xstream序列化XML时可以允许用户使用不同的XML解析器,详情看下边三种方式。
[/code]
推荐使用第一种Pull解析,由于也有许多版本了,而我下载的是1.4.10最新版本的。如果下载老版本大概1.4.6版本左右,上边的Pull解析方式是需要xpp3.jar支持的。还是下载最新的比较方便,而且导包的时候好像还要改些东西。如果各位非要使用老版本的,那就再去下载个xpp3.jar吧,也就稍微麻烦点~~~流汗!!
这里的LocList.xml是放在assest目录下的,Activity中就这几行代码怎么样够简单吧!!
首先这个xml串,是有中国的所有省/市/区,只晒了一部分如果大家想要可以下载LoaList.xml,可以看到都是以属性的方式存在xml里的
China表示中国 里边每一个State表示省(Name是省名称,Code是省代码),State里面每个 City表示城市 ,City里面每个 Region表示区/县,大家肯定都能看懂,这样一个三级嵌套我们就来解析他了,当然直辖市只有二级~~~哈哈
我们分析一下这个数据:
最外层是 State这个节点是需要注解的(需要注解 ),所以声明一个List 包含两个属性Name和Code
List中的每条Itembean 中没有内容都有两个属性,而且内容是不需要注解的。所以吧Name和Code加上注解就行了
举一反三 City和Region 跟State是一样的
我们一层一层去解析:
根据上边的分析,我们编写一个javabean :
我们从上面的例子看到,xml的解析方式,那么其他的类型应该也都是大同小异了。
下面我们把解析出来的数据,用作地址选择器的数据源。
在这里也推荐个地址选择器的框架里边也有时间选择器,个人感觉不错点击查看
有什么疑问或者建议请在下边留言,很乐意为大家解答,也想请大家多多指点,谢谢大家支持
现在Android开发中,基本都是JSON的解析,相对与XML的话比较方便。但是不可避免也会用到XML解析,Json解析相信大家都比较熟悉了,这里就不多介绍了 。Android 的XML解析三种方式Dom,Sax,Pull想必大家也都知道。如果内容比较少的话还可以
但是如果比较多,也比较复杂。就有点太繁琐了。
用XStream解析XML
首先是用到的jar包 Xstream-1.4.10.jar 这里我下载的是最新版本的,不需要xapp3.jar的支持下载jar包请点击这里Xstream序列化XML时可以允许用户使用不同的XML解析器,详情看下边三种方式。
XStream xstream = new XStream();//Pull解析方式 XStream xstream = new XStream(new DomDriver());//Dom解析方式 XStream xstream = new XStream(new StaxDriver());//需要使用java1.6的支持
[/code]
推荐使用第一种Pull解析,由于也有许多版本了,而我下载的是1.4.10最新版本的。如果下载老版本大概1.4.6版本左右,上边的Pull解析方式是需要xpp3.jar支持的。还是下载最新的比较方便,而且导包的时候好像还要改些东西。如果各位非要使用老版本的,那就再去下载个xpp3.jar吧,也就稍微麻烦点~~~流汗!!
使用
我们拿到那个内容的xml字符串之后。可以同过下面几句代码将内容转为javaBeanXStream stream = new XStream(); //Loaction.class是你要将xml转的bean的类,需要注解是你自己根据xml写(下面附代码解释xml) stream.processAnnotations(LocListBean.class); LocListBean LocListBean = (LocListBean) xStream.fromXML(getResources().getAssets().open("LocList.xml"));
这里的LocList.xml是放在assest目录下的,Activity中就这几行代码怎么样够简单吧!!
实例1
LocList.xml内容为:<China> <State Name="北京" Code="11"> <City Name="东城" Code="1" /> <City Name="西城" Code="2" /> <City Name="朝阳" Code="5" /> <City Name="丰台" Code="6" /> <City Name="石景山" Code="7" /> <City Name="海淀" Code="8" /> <City Name="门头沟" Code="9" /> <City Name="房山" Code="11" /> <City Name="通州" Code="12" /> <City Name="顺义" Code="13" /> <City Name="昌平" Code="21" /> <City Name="大兴" Code="24" /> <City Name="平谷" Code="26" /> <City Name="怀柔" Code="27" /> <City Name="密云" Code="28" /> <City Name="延庆" Code="29" /> </State> <State Name="河北" Code="13"> <City Name="石家庄" Code="1"> <Region Name="长安区" Code="2" /> <Region Name="桥东区" Code="3" /> <Region Name="桥西区" Code="4" /> <Region Name="新华区" Code="5" /> <Region Name="井陉矿区" Code="7" /> <Region Name="裕华区" Code="8" /> <Region Name="井陉县" Code="21" /> <Region Name="正定县" Code="23" /> <Region Name="栾城县" Code="24" /> <Region Name="行唐县" Code="25" /> <Region Name="灵寿县" Code="26" /> <Region Name="高邑县" Code="27" /> <Region Name="深泽县" Code="28" /> <Region Name="赞皇县" Code="29" /> <Region Name="无极县" Code="30" /> <Region Name="平山县" Code="31" /> <Region Name="元氏县" Code="32" /> <Region Name="赵县" Code="33" /> <Region Name="辛集市" Code="81" /> <Region Name="藁城市" Code="82" /> <Region Name="晋州市" Code="83" /> <Region Name="新乐市" Code="84" /> <Region Name="鹿泉市" Code="85" /> </City> </State> ...... <China>
首先这个xml串,是有中国的所有省/市/区,只晒了一部分如果大家想要可以下载LoaList.xml,可以看到都是以属性的方式存在xml里的
China表示中国 里边每一个State表示省(Name是省名称,Code是省代码),State里面每个 City表示城市 ,City里面每个 Region表示区/县,大家肯定都能看懂,这样一个三级嵌套我们就来解析他了,当然直辖市只有二级~~~哈哈
我们分析一下这个数据:
最外层是 State这个节点是需要注解的(需要注解 ),所以声明一个List 包含两个属性Name和Code
List中的每条Itembean 中没有内容都有两个属性,而且内容是不需要注解的。所以吧Name和Code加上注解就行了
举一反三 City和Region 跟State是一样的
我们一层一层去解析:
根据上边的分析,我们编写一个javabean :
@XStreamAlias("China")//必须写这个注解 public class LoaListBean { @XStreamImplicit(itemFieldName = "State")//节点注解(也是必须的) private List<State> State; public List<State> getState() { return State; } public void setState(List<ChinaAddressBean.State> state) { State = state; } public static class State { @XStreamAsAttribute() @XStreamAlias("Name")//属性注解也要写,我们的xml都是以属性的方式存的,如果有值的话,值不用注解 private String Name; @XStreamAsAttribute() @XStreamAlias("Code")//属性注解 private String Code; @XStreamImplicit(itemFieldName = "City")//节点注解 private List<City> City; public String getName() { return Name; } public void setName(String name) { Name = name; } public String getCode() { return Code; } public void setCode(String code) { Code = code; } public List<City> getCity() { return City; } public void setCity(List<City> city) { City = city; } public static class City { @XStreamAsAttribute() @XStreamAlias("Name")//属性注解 private String Name; @XStreamAsAttribute() @XStreamAlias("Code")//属性注解 private String Code; @XStreamImplicit(itemFieldName = "Region")//节点注解 private List<Region> Region; public List<Region> getRegion() { return Region; } public void setRegion(List<Region> region) { Region = region; } public String getName() { return Name; } public void setName(String name) { Name = name; } public String getCode() { return Code; } public void setCode(String code) { Code = code; } public static class Region { @XStreamAsAttribute() @XStreamAlias("Name")//属性注解 private String Name; @XStreamAsAttribute() @XStreamAlias("Code")//属性注解 private String Code; public String getName() { return Name; } public void setName(String name) { Name = name; } public String getCode() { return Code; } public void setCode(String code) { Code = code; } } } } }
我们从上面的例子看到,xml的解析方式,那么其他的类型应该也都是大同小异了。
下面我们把解析出来的数据,用作地址选择器的数据源。
Activity中代码
public class VersionActivity extends AppCompatActivity { //声明三个集合分别代表省,市,县。 private List<String> List1 = new ArrayList<>(); private List<List<String>> List2 = new ArrayList<>(); private List<List<List<String>>> List3 = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_version); ButterKnife.bind(this); AddressDate(); } public void AddressDate() { XStream xStream = new XStream(); xStream.processAnnotations(ChinaAddressBean.class); LocListBean locListBean = null; try { locListBean = (LoaListBean) xStream.fromXML(getResources().getAssets().open("LocList.xml")); } catch (IOException e) { e.printStackTrace(); } fo b11a r (int i = 0; i < chinaAddressBean.getState().size(); i++) { List<String> list1 = new ArrayList<>(); //省 List1.add(locListBean.getState().get(i).getName()); //市 List<List<String>> list2 = new ArrayList<>(); for (int j = 0; j < locListBean.getState().get(i).getCity().size(); j++) { List<String> list2_1 = new ArrayList<>(); List<String> list2_2 = new ArrayList<>(); list1.add(locListBean.getState().get(i).getCity().get(j).getName()); //区 List<locListBean.State.City.Region> address = locListBean.getState().get(i).getCity().get(j).getRegion(); if (address != null) { for (int k = 0; k < address.size(); k++) { list2_1.add(address.get(k).getName()); } list2.add(list2_1); } else { list2_2.add(""); list2.add(list2_2); } } List2.add(list1); List3.add(list2); } } //到这里 List1,List2,List3数据已经添加完了,可以直接把数据放到你的地址选择器里边当数据源了。
在这里也推荐个地址选择器的框架里边也有时间选择器,个人感觉不错点击查看
XStream的几种注解
Xstream注解常用知识:@XStreamAlias("message") 别名注解 作用目标: 类,字段 @XStreamImplicit 隐式集合 @XStreamImplicit(itemFieldName="part") 作用目标: 集合字段 @XStreamConverter(SingleValueCalendarConverter.class) 注入转换器 作用目标: 对象 @XStreamAsAttribute 转换成属性 作用目标: 字段 @XStreamOmitField 忽略字段 作用目标: 字段 Auto-detect Annotations 自动侦查注解 xstream.autodetectAnnotations(true); 自动侦查注解与XStream.processAnnotations(Class[] cls)的区别在于性能.自动侦查注解将缓存所有类的类型.
有什么疑问或者建议请在下边留言,很乐意为大家解答,也想请大家多多指点,谢谢大家支持
相关文章推荐
- android xml解析库选择
- android xml解析,xml to JavaBean
- Android pull封装,直接解析xml
- 让android webView使用系统默认浏览器内核直接解析,不弹出选择浏览器选项
- android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档
- Layout inflation在Android环境中是一个专业术语,用于表示某个XML资源布局文件被解析并转化成为一个层级的View对象的过程。
- [转]解析json:与array,list,map,bean,xml相互转化
- android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档
- Android 用 XStream 将复杂xml解析为javabean
- Android学习-- 使用Pull解析XML文件
- android对xml的各种解析方法
- android xml解析XmlPullParser的使用
- android PULL解析XML
- android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理 (1)
- 用JavaScript生成Android SDK的下载地址(2)——异步加载、解析xml,得到全部SDK的下载地址
- Android网络编程之pull解析xml
- android xml解析 XmlPullParser的使用
- Android中XML文件常用解析方式的比较分析
- android pull解析XML文件
- Android 创建与解析XML(一)—— 概述