一.最近突然有一个需求需要使用xml解析,很懵这玩意都很多年没有用了.没办法搞呗.首先这边讲解的是xml解析部分。
可以看到这边这个字符串是后台给我返回的一个 xml,接下来我们就要对它进行操作了.
String confXml = protocol0x0825.getConfXml();
Log.i("阿狸:--0x0825", confXml);
//因为解析很多都是解析xml文件的,既然咱要解析这个字符串就需要先把转换成流的形式
InputStream in = new ByteArrayInputStream(confXml.getBytes("UTF-8"));//如果出现乱码,就用你的框架的编码如utf-8
//这边我们写了一个工具类调用这个流
persons = getPersons(in);
//判断这边的集合不等于空的情况下把这个list添加到我们的主list里面然后刷新适配器
if (persons != null) {
//添加到集合里面
list.addAll(persons);
//刷新适配器
adapter.notifyDataSetChanged();
}
好了接下来我们看一下这个工具类里面做了什么操作呢. 工具类是我根据我这边的参数设置的,要适用的话记得改一下下面的判断,然后就可以直接搬过来用了.
/**
* 采用PULL解析XML内容
*/
public List<ConfInfo> getPersons(InputStream inputStream) throws Exception {
List<ConfInfo> persons = null;
ConfInfo person = null;
//得到PULL解析器
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inputStream, "UTF-8");
//产生事件
int eventType = parser.getEventType();
//如果不是文档结束事件就循环推进
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT://开始文档事件
persons = new ArrayList<>();
break;
case XmlPullParser.START_TAG://开始元素事件
//获取解析器当前指向的元素的名称
String name = parser.getName();
//我这边这些参数都在conf下面
if ("conf".equals(name)) {
person = new ConfInfo();
//因为我这边只要五个参数 这边这个取值是根据索引进行取的
person.setConfID(parser.getAttributeValue(0));
person.setConfName(parser.getAttributeValue(1));
person.setConfPwd(parser.getAttributeValue(2));
person.setAdminName(parser.getAttributeValue(6));
person.setIsPublic(parser.getAttributeValue(8));
}
break;
case XmlPullParser.END_TAG://结束元素事件
//判断是都是person的结束事件
if ("conf".equals(parser.getName())) {
//结束的时候添加到集合里面
persons.add(person);
person = null;
}
break;
}
//进入下一个元素并触发相应的事件
eventType = parser.next();
}
//返回
return persons;
}
二.到这里解析已经完事了,接下来讲一下xml转对象. 首先创建数据的实体类
package elink.mobile.im.bean;
import elink.mobile.im.bean.CreateMeeti;
/**
* author : 白月初
* e-mail : anleiya@163.com
* date : 2021/4/2914:30
* desc :
* version: 1.0
*/
public class Meeti {
private CreateMeeti conf;
public CreateMeeti getConf() {
return conf;
}
public void setConf(CreateMeeti conf) {
this.conf = conf;
}
}
这边有俩个实体类 因为外层有包裹参数
package elink.mobile.im.bean;
/**
* author : 白月初
* e-mail : anleiya@163.com
* date : 2021/4/2817:59
* desc :
* version: 1.0
*/
public class CreateMeeti {
//1.会议名称
private String confName;
// 2.会议id parentConfID="0"
private String parentConfID;
//3.会议密码
private String confPwd;
//4.结束时间
private String endTime;
//5.开始时间
private String startTime;
//6.是否匿名 isPublic="0"
private String isPublic;
//7.参加会议人id
private String users;
//8.发起会议人name
private String adminName;
//9.会议摘要
private String confDesc;
public void setConfName(String confName) {
this.confName = confName;
}
public void setParentConfID(String parentConfID) {
this.parentConfID = parentConfID;
}
public void setConfPwd(String confPwd) {
this.confPwd = confPwd;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public void setIsPublic(String isPublic) {
this.isPublic = isPublic;
}
public void setUsers(String users) {
this.users = users;
}
public void setAdminName(String adminName) {
this.adminName = adminName;
}
public void setConfDesc(String confDesc) {
this.confDesc = confDesc;
}
public String getConfName() {
return confName;
}
public String getParentConfID() {
return parentConfID;
}
public String getConfPwd() {
return confPwd;
}
public String getEndTime() {
return endTime;
}
public String getStartTime() {
return startTime;
}
public String getIsPublic() {
return isPublic;
}
public String getUsers() {
return users;
}
public String getAdminName() {
return adminName;
}
public String getConfDesc() {
return confDesc;
}
@Override
public String toString() {
return "CreateMeeti{" +
"confName='" + confName + '\'' +
", parentConfID='" + parentConfID + '\'' +
", confPwd='" + confPwd + '\'' +
", endTime='" + endTime + '\'' +
", startTime='" + startTime + '\'' +
", isPublic='" + isPublic + '\'' +
", users='" + users + '\'' +
", adminName='" + adminName + '\'' +
", confDesc='" + confDesc + '\'' +
'}';
}
}
下面是怎么去使用
//实体类
CreateMeeti meeti=new CreateMeeti();
//把要转换xml的参数放到实体类里面
meeti.setConfName(confName);
meeti.setParentConfID(parentConfID);
meeti.setConfPwd(confPwd);
meeti.setEndTime(endTime);
meeti.setStartTime(startTime);
meeti.setIsPublic(isPublic);
meeti.setUsers(users);
meeti.setAdminName(adminName);
meeti.setConfDesc(confDesc);
//这个方法是一个java转换xml的一个libs插件
XStream xStream = new XStream();
//创建最外层的实体类
Meeti conf = new Meeti();
//把我们需要添加的参数实体类放进去
conf.setConf(meeti);
//最外层是confs 所以这里写这个
xStream.alias("confs", Meeti.class);
//然后添加内层参数
xStream.useAttributeFor(CreateMeeti.class,"confName");
xStream.useAttributeFor(CreateMeeti.class,"parentConfID");
xStream.useAttributeFor(CreateMeeti.class,"confPwd");
xStream.useAttributeFor(CreateMeeti.class,"endTime");
xStream.useAttributeFor(CreateMeeti.class,"startTime");
xStream.useAttributeFor(CreateMeeti.class,"isPublic");
xStream.useAttributeFor(CreateMeeti.class,"users");
xStream.useAttributeFor(CreateMeeti.class,"adminName");
xStream.useAttributeFor(CreateMeeti.class,"confDesc");
//添加完以后这里toXmL就可以转换成一个字符串了
//这个字符串里面就是我们想要的xml
//得到xml文件
String string2 = xStream.toXML(conf);
Log.i("阿狸:string2--",string2);
这里可以看到我们已经转换成功了,接下来看我们需要怎么处理
XStream 这个libs插件 推荐使用xstream-1.4.7版本的,因为这东西比较老了 这边提供了下载地址可以去下载添加.
点击下载 XStream插件 提取码:7fz5