接手一个新项目,拿到接口文档一看,一万个草泥马在心中飘过!与后台的数据交互方式竟然是xml数据,其实也没啥了,个人用json习惯了,做了那么多项目就没碰过用xml的,没办法,就是干!一开始自己也是傻逼了,竟然用Pull解析一个一个的将xml数据解析成实体类,一个实体类对应一个解析方法,也是醉了!好在及时醒悟,毕竟xml数据也是有规律的,于是封装了个万能的方法,只针对此项目的哈,在此做个记录:
1.先看下数据形式:
private String xmlString="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<root><msgname>user/queryUserInfo</msgname><transactionid>1241241</transactionid>" +
"<timestamp></timestamp><result>000000</result><resultdesc>请求成功</resultdesc>" +
"<body><name>vitor</name><identitycardno>1234568797994564</identitycardno>" +
"<photo>adfsadfads</photo><birthdate>1990-12-26</birthdate><validdate>456</validdate><address>深圳</address><signorg>opsdf</signorg><nation>汉</nation>" +
"<sex></sex><mobile>15019297974</mobile><email>wuzq@qq.com</email><accountno>00118881000030200009</accountno>" +
"<isrealname>0</isrealname><username>wuzq</username><retcode>000000</retcode><retmsg></retmsg></body></root>";
2.解析数据:
(1)创建实体类:
public class UserInfo {
private String name;
private String identitycardno;
private String photo;
private String birthdate;
private String validdate;
private String address;
private String signorg;
private String nation;
private String sex;
private String mobile;
private String retcode;
private String retmsg;
private int isrealname;
private String accountno;
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAccountno() {
return accountno;
}
public void setAccountno(String accountno) {
this.accountno = accountno;
}
public int getIsrealname() {
return isrealname;
}
public void setIsrealname(int isrealname) {
this.isrealname = isrealname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdentitycardno() {
return identitycardno;
}
public void setIdentitycardno(String identitycardno) {
this.identitycardno = identitycardno;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public String getBirthdate() {
return birthdate;
}
public void setBirthdate(String birthdate) {
this.birthdate = birthdate;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getValiddate() {
return validdate;
}
public void setValiddate(String validdate) {
this.validdate = validdate;
}
public String getSignorg() {
return signorg;
}
public void setSignorg(String signorg) {
this.signorg = signorg;
}
public String getNation() {
return nation;
}
@Override
public String toString() {
return "UserInfo{" +
"name='" + name + '\'' +
", identitycardno='" + identitycardno + '\'' +
", photo='" + photo + '\'' +
", birthdate='" + birthdate + '\'' +
", validdate='" + validdate + '\'' +
", address='" + address + '\'' +
", signorg='" + signorg + '\'' +
", nation='" + nation + '\'' +
", sex='" + sex + '\'' +
", mobile='" + mobile + '\'' +
", retcode='" + retcode + '\'' +
", retmsg='" + retmsg + '\'' +
", isrealname=" + isrealname +
", accountno='" + accountno + '\'' +
", email='" + email + '\'' +
'}';
}
public void setNation(String nation) {
this.nation = nation;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getRetcode() {
return retcode;
}
public void setRetcode(String retcode) {
this.retcode = retcode;
}
public String getRetmsg() {
return retmsg;
}
public void setRetmsg(String retmsg) {
this.retmsg = retmsg;
}
}
(2)利用反射封装解析方法:
public static <T>T xmlToObject(String xmlResult, Class<T> clz, String tagName){ XmlPullParser parser= Xml.newPullParser(); T t=null; try { parser.setInput(new ByteArrayInputStream(xmlResult.getBytes("UTF-8")),"UTF-8"); int eventType=parser.getEventType(); while (eventType!=XmlPullParser.END_DOCUMENT){ switch (eventType){ case XmlPullParser.START_DOCUMENT:{ }break; case XmlPullParser.START_TAG:{ if (t != null) { try { Field field = clz.getDeclaredField(parser.getName()); if (field != null) { field.setAccessible(true); String type = field.getType().getSimpleName(); if (type.contains("String")) { field.set(t, parser.nextText()); } else if (type.contains("int")) { field.set(t,Integer.valueOf(parser.nextText())); } else if (type.contains("boolean")) { field.set(t,Boolean.valueOf(parser.nextText())); } else if (type.contains("float")) { field.set(t,Float.valueOf(parser.nextText())); } else if (type.contains("double")) { field.set(t,Double.valueOf(parser.nextText())); }else if (type.contains("long")) { field.set(t,Long.valueOf(parser.nextText())); } } } catch (Exception e) { e.printStackTrace(); } } if (tagName.equals(parser.getName())){ t=clz.newInstance(); } }break; case XmlPullParser.END_TAG:{ }break; } eventType=parser.next(); } return t; } catch (Exception e) { e.printStackTrace(); } return null; }
(3)查看demo