您的位置:首页 > 移动开发 > Android开发

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

首先是用到的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字符串之后。可以同过下面几句代码将内容转为javaBean

XStream 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)的区别在于性能.自动侦查注解将缓存所有类的类型.

有什么疑问或者建议请在下边留言,很乐意为大家解答,也想请大家多多指点,谢谢大家支持
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息