明天==明年了,今天写一个工具方法,明年用
项目中使用了一个牛叉的方法解析xml,使用麻烦,速度又慢。为项目中独特解析方式写的工具方法就不拿出来了,大同小异,就是xml解析不一样,试用了getDeclaredFields获取bean中的字段
在解析json的时候好多的第三方可以一行代码解析数据,相当好用,解析xml使用第三方也是比较麻烦,写个工具类,来一句话解析xml
Java与Android之间反射有点区别:
*1、Android中java.beans包没了,通过使用PropertyDescriptor类来调用get/set方法没法用了
2、Field[] fields = cla.getDeclaredFields();在Java中是按照字段定义顺序,而在Android中获取到的字段数组是排序过后的,据前辈猜测是jvm的原因。*
xml中几个特殊字符对应的转义:
// < – <
// > – >
// & – &
// ” – "
// ’ – '
调用:
数据bean中都是String类型的,要有别的类型再getType处理,
只拿到节点文本,没有拿节点属性,项目中的xml没有属性
// 如果约定好了,第二个参数可以直接在方法中写死
List<DbsxBean> datas2 = parseResultPull(result, "OBJ", DbsxBean.class);
/**
* XML解析
*
* @author ztt
* @Title: parseResultPull
* @Description:
* @param @param result 返回值
* @param @param objTag 数据对象节点
* @param @param cla 数据bean
* @return List<T> 返回数据集合
* @date 2015-12-31
*/
public <T> List<T> parseResultPull(String result,String objTag,Class<T> cla) {
List<T> datas = new ArrayList<T>();
XmlPullParserFactory xmlPullParserFactory = null;
XmlPullParser xmlPullParser = null;
int eventType = 0;
String nodeName = "";
try {
xmlPullParserFactory = XmlPullParserFactory.newInstance();
xmlPullParser = xmlPullParserFactory.newPullParser();
xmlPullParser.setInput(new StringReader(result));
eventType = xmlPullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {// 文档结束标记
if (eventType == XmlPullParser.START_TAG && objTag.equals(nodeName)) {
T t = cla.newInstance(); // 反射创建一个对象
eventType = xmlPullParser.next(); // 切换到下一个节点(开始节点,Text内容节点,结束节点)
nodeName = xmlPullParser.getName(); // 获取节点名字,内容节点返回null
while (!(eventType == XmlPullParser.END_TAG || objTag.equals(nodeName))) {
if (eventType == XmlPullParser.START_TAG && !TextUtils.isEmpty(nodeName)) {
Method meth = cla.getMethod("set" + firstUpcase(nodeName), String.class);
meth.invoke(t, xmlPullParser.nextText());
}
eventType = xmlPullParser.next();
nodeName = xmlPullParser.getName();
}
datas.add(t);
}
eventType = xmlPullParser.next();
nodeName = xmlPullParser.getName();
}
} catch (Exception e) {
throw new Error("xml PULL 解析出现错误");
}
return datas;
}
/**
* 将第一个字母转成大写
* @date 2015-12-31
*/
public String firstUpcase(String data) {
return TextUtils.isEmpty(data) ? "" : data.substring(0,1).toUpperCase(Locale.getDefault())+data.substring(1);
}
数据bean:
package com.ztt.tax.bean;
public class DbsxBean {
private String SFZH = null;
private String YHDM = null;
private String TXNR = null;
private String TXSJ = null;
private String BZ1 = null;
private String BZ2 = null;
private String BZ3 = null;
private String PATHXX = null;
private String RN = null;
public DbsxBean(String sFZH, String yHDM, String tXNR, String tXSJ,
String bZ1, String bZ2, String bZ3, String pATHXX, String rN) {
super();
SFZH = sFZH;
YHDM = yHDM;
TXNR = tXNR;
TXSJ = tXSJ;
BZ1 = bZ1;
BZ2 = bZ2;
BZ3 = bZ3;
PATHXX = pATHXX;
RN = rN;
}
public DbsxBean() {
super();
}
public String getSFZH() {
return SFZH;
}
public void setSFZH(String sFZH) {
SFZH = sFZH;
}
public String getYHDM() {
return YHDM;
}
public void setYHDM(String yHDM) {
YHDM = yHDM;
}
public String getTXNR() {
return TXNR;
}
public void setTXNR(String tXNR) {
TXNR = tXNR;
}
public String getTXSJ() {
return TXSJ;
}
public void setTXSJ(String tXSJ) {
TXSJ = tXSJ;
}
public String getBZ1() {
return BZ1;
}
public void setBZ1(String bZ1) {
BZ1 = bZ1;
}
public String getBZ2() {
return BZ2;
}
public void setBZ2(String bZ2) {
BZ2 = bZ2;
}
public String getBZ3() {
return BZ3;
}
public void setBZ3(String bZ3) {
BZ3 = bZ3;
}
public String getPATHXX() {
return PATHXX;
}
public void setPATHXX(String pATHXX) {
PATHXX = pATHXX;
}
public String getRN() {
return RN;
}
public void setRN(String rN) {
RN = rN;
}
@Override
public String toString() {
return "SFZH," + SFZH + ",YHDM" + YHDM + ",TXNR" + TXNR + ",TXSJ"
+ TXSJ + ",BZ1" + BZ1 + ",BZ2" + BZ2 + ",BZ3" + BZ3 + ",PATHXX"
+ PATHXX + ",RN" + RN;
}
}
数据源格式:直接用的项目中的接口,地址不能给出,数据已修改
<?xml version="1.0" encoding="UTF-8"?>
<xml>
<code>100</code>
<totlecount>15</totlecount>
<OBJ>
<SFZH>98302342341</SFZH>
<YHDM>98asdf</YHDM>
<TXNR>个人工作任务已提交,请您及时审核!</TXNR>
<TXSJ>2015-12-30 09:42:34</TXSJ>
<BZ1></BZ1>
<BZ2></BZ2>
<BZ3></BZ3>
<PATHXX>/individual0afea459296fd6a1a2be53acf&dbId=db9e865a508b4b86b7b6bd5d631d68ca</PATHXX>
<RN>1</RN>
</OBJ>
</xml>