import java.io.StringWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
import org.nutz.lang.Lang;
import com.jiedu.easyclass.common.annotation.XmlFilter;
public class XmlUtils {
//xml转list,遇到不和规范的xml文件时,自定义解析
public static <T> List<T> myString2List(String xml,Class clazz){
List<T> list = new ArrayList<T>();
try {
if (xml == null) {
return null;
} else {
//判断xml中是否有<key>
if (xml.indexOf("<key>") > -1 && xml.indexOf("</key>") > -1) {
String key = xml.substring(xml.indexOf("<key>") + 5,xml.indexOf("</key>")).trim();
//根据key验证是否需要解析xml
if (key == null && !"jieduqazwsx".equals(key)) {
return null;
}
//判断xml中是否有<data>
if (xml.indexOf("<data>") > -1 && xml.indexOf("</data>") > -1) {
//获取data标签下字符串
xml = xml.substring(xml.indexOf("<data>") + 6,xml.indexOf("</data>")).trim();
if (xml != null) {
String[] xmls = xml.split("<data");
Field[] field = clazz.getDeclaredFields();
//data标签下不存在data标签时返回失败
if(xmls.length<1) return null;
for (int i = 0; i < xmls.length; i++) {
//获取 cardId='11' type='3' createTime='2018-09-07 00:00:00' 格式字符串
if (!StringUtils.isEmpty(xmls[i])) {
T msg=(T)clazz.newInstance();
String Strlist = xmls[i].substring(0,xmls[i].lastIndexOf("/"));
//转换成Msg格式
for (int j = 0; j < field.length; j++) {
// 获取属性的名字
String attr = null;
String name = field[j].getName();
//不需要传入的字段,通过自定义注解XmlFilter过滤
XmlFilter x=field[j].getAnnotation(XmlFilter.class);
if(!Lang.isEmpty(x) && x.ignore()){
continue;
}
if(!(Strlist.indexOf(name)>-1)){
continue;
}
int n=Strlist.indexOf("\"", Strlist.indexOf(name));
int nn=Strlist.indexOf("\"", n+1);
attr = Strlist.substring(Strlist.indexOf(name), nn+1).trim();
//将属性的首字符大写,方便构造get,set方法
name = name.substring(0, 1).toUpperCase() + name.substring(1);
Method setValue = msg.getClass().getMethod("set"+name,String.class);
String value =attr.substring(attr.indexOf("=")+2, attr.length()-1);
setValue.invoke(msg, value);
}
list.add(msg);
}
}
}else{
//data标签下字符串为空时返回失败
return null;
}
}else{
//xml中是没有<data>时返回失败
return null;
}
} else {
//xml中是没有<key>时返回失败
return null;
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return list;
}
//创建一个xml文档
public static String ListToXml(List<Map<String, String>> list){
Document doc = DocumentHelper.createDocument();
Element result = doc.addElement("result");
for (Map<String, String> map : list) {
Element student = result.addElement("student");
student.addAttribute("cardId", map.get("cardId"));
student.addAttribute("status", map.get("status"));
student.addAttribute("msg", map.get("msg"));
}
return doc.asXML();
}
//map转xml
public static String map2xml(Map<String, String> map){
Document d = DocumentHelper.createDocument();
Element root = d.addElement("xml");
Set<String> keys = map.keySet();
for(String key:keys) {
root.addElement(key).addText(map.get(key));
}
StringWriter sw = new StringWriter();
XMLWriter xw = new XMLWriter(sw);
xw.setEscapeText(false);
try {
xw.write(d);
} catch (Exception e) {
e.printStackTrace();
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?><xml><msg>systemError</msg><status>3</status></xml>";
}
return sw.toString();
}