java自定义xml解析

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();
	    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值