基于FastXml的Xml工具类

原创
2020/05/08 15:47
阅读数 186
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.seaframework.web.exception.BusinessException;

import com.github.fastxml.FastXmlFactory;
import com.github.fastxml.FastXmlParser;
import com.github.fastxml.exception.ParseException;

public class XmlKit {

	/**
	 * 返回保存信息
	 * 
	 * @param code 200成功  300失败
	 * @param msg 详细信息
	 * @param id 数据库主键
	 * @return
	 */
	public static String parsePara(String code, String msg, String id){
		StringBuilder xmlStr=new StringBuilder(200);
		xmlStr.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
			.append("<RESULT><STATUS>").append(code).append("</STATUS><DESC>")
			.append(msg).append("</DESC><TIME>").append(String.format("%1$tY%1$tm%1$td%1$tH%1$tM%1$tS", new Date()))
			.append("</TIME><DATA><buspk>").append(id).append("</buspk></DATA></RESULT>");
		
		return xmlStr.toString();
	}
	
	/**
	 * 将xml转换成bean对象的主键
	 * 
	 * @param xml xml内容
	 * @param node xml中主键的节点名称
	 * @throws Exception
	 */
	public static Long parseId(String xml, String node) throws Exception{
		String id=parseObj(xml, node);
		
		return id==null?null:Long.valueOf(id);
	}
	
	/**
	 * 将xml中的节点值转换成String
	 * 
	 * @param xml xml内容
	 * @param node xml中的节点名称
	 * @throws Exception
	 */
	public static String parseObj(String xml, String node) throws Exception{
		byte[] xmls=xml.getBytes();
		byte[] status="STATUS".getBytes();
		byte[] nodes="TableCols".getBytes();
		byte[] beans=node.getBytes();
		int next=0;
		FastXmlParser parser=FastXmlFactory.newInstance(xmls);
		for(;;){
			next=parser.next();
			if(next==FastXmlParser.START_TAG){
				if(parser.isMatch(status)){
					parser.next();
					if(parser.getInt()!=200){
						throw new BusinessException("99999", "返回业务信息失败");
					}
				}else if(parser.isMatch(beans)){
					if(parser.next()==FastXmlParser.TEXT){
            			return new String(parser.getRawBytes());
            		}else{
            			return null;
            		}
				}
			}else if(next==FastXmlParser.END_TAG&&parser.isMatch(nodes)){
				return null;
        	}
		}
	}
	
	/**
	 * 将xml转换成bean对象
	 * 
	 * @param xml xml内容
	 * @param node xml中bean开始的节点
	 * @param clazz bean的class对象
	 * @param obj bean的实例
	 * @throws Exception
	 */
	public static <T> T parseBean(String xml, String node, Class<T> clazz, T obj) throws Exception{
		byte[] xmls=xml.getBytes();
		byte[] status="STATUS".getBytes();
		byte[] beans=node.getBytes();
		byte[] nodes="SPItemListDef".getBytes();
		FastXmlParser parser=FastXmlFactory.newInstance(xmls);
		for(;;){//跳过描述信息
			if(parser.next()==FastXmlParser.START_TAG){
				if(parser.isMatch(status)){
					parser.next();
					if(parser.getInt()!=200){
						throw new BusinessException("99999", "返回业务信息失败");
					}
				}else if(parser.isMatch(beans)){
					break;
				}
			}
		}
		//将xml绑定到bean
		BeanInfo info=Introspector.getBeanInfo(clazz);
		PropertyDescriptor[] props=info.getPropertyDescriptors();
		PropertyDescriptor prop=null;
        Method method=null;
        String raw=null;
        int length=props.length, next=0, i=0;
        for(int nextEvent=parser.getNextEvent();nextEvent!=FastXmlParser.END_DOCUMENT;nextEvent=parser.getNextEvent()){
        	next=parser.next();
        	if(next==FastXmlParser.START_TAG){
        		for(i=0; i<length; ++i){
        			prop=props[i];
        			raw=StrKit.toLowerCase(parser.getRawBytes());
        			if(prop.getName().equals(raw)){
                		if(parser.next()!=FastXmlParser.TEXT){
                			break;
                		}
                		raw=new String(parser.getRawBytes());
                		if("null".equals(raw)){
                			break;
                		}
                		method=prop.getWriteMethod();
                		method.invoke(obj, str2type(prop.getPropertyType(), raw));
                        break;
        			}
				}
        	}else if(next==FastXmlParser.END_TAG&&parser.isMatch(nodes)){
        		break;
        	}
        }
        
        return obj;
	}
	
	/**
	 * 将xml转换成List对象
	 * @param <T>
	 * 
	 * @param xml xml内容
	 * @param node xml中bean开始的节点
	 * @param subnode xml中bean开始的子节点
	 * @param clazz bean的class对象
	 * @throws Exception
	 */
	public static <T> List<T> parseList(String xml, String node, String nodeid, String subnode, Class<T> clazz) throws Exception{
		byte[] xmls=xml.getBytes();
		byte[] status="STATUS".getBytes();
		byte[] beans=node.getBytes();
		byte[] beanid=nodeid.getBytes();
		byte[] subbeans=subnode.getBytes();
		FastXmlParser parser=FastXmlFactory.newInstance(xmls);
		for(;;){//跳过描述信息
			if(parser.next()==FastXmlParser.START_TAG){
				if(parser.isMatch(status)){
					parser.next();
					if(parser.getInt()!=200){
						throw new BusinessException("99999", "返回业务信息失败");
					}
				}else if(parser.isMatch(beans)){
					parser.next();
					parser.next();
					if(parser.isMatch(beanid)){
						break;
					}
				}
			}
		}
		//将xml绑定到bean并添加到list
		List<T> list=new ArrayList<>();
		BeanInfo info=Introspector.getBeanInfo(clazz);
		PropertyDescriptor[] props=info.getPropertyDescriptors();
		PropertyDescriptor prop=null;
        Method method=null;
        String raw=null;
        T obj=null;
        int length=props.length, next=0, flag=0, i=0;
        for(int nextEvent=parser.getNextEvent();nextEvent!=FastXmlParser.END_DOCUMENT;nextEvent=parser.getNextEvent()){
        	next=parser.next();
        	if(next==FastXmlParser.START_TAG){
        		if(flag==0&&parser.isMatch(subbeans)){
        			obj=clazz.newInstance();
        			flag=1;
        		}
        		for(i=0; i<length; ++i){
        			prop=props[i];
        			raw=toLowerCase(parser.getRawBytes());
        			if(prop.getName().equals(raw)){
                		if(parser.next()!=FastXmlParser.TEXT){
                			break;
                		}
                		raw=new String(parser.getRawBytes());
                		if("null".equals(raw)){
                			break;
                		}
                		method=prop.getWriteMethod();
                		method.invoke(obj, str2type(prop.getPropertyType(), raw));
                        break;
        			}
				}
        	}else if(next==FastXmlParser.END_TAG){
        		if(parser.isMatch(beans)){
            		break;
        		}else if(parser.isMatch(subbeans)){
        			flag=0;
        			list.add(obj);
        		}
        	}
        }
        
        return list;
	}
		
	/**
	 * 将String转换为指定类型的值
	 * 
	 * @param clazz
	 * @param val
	 * @return
	 * @throws ParseException 
	 */
	public static <T> T str2type(Class<T> clazz, String val) throws ParseException{
        if(clazz==String.class){
        	return (T) val;
        }else if(clazz==Long.class || clazz == long.class){
        	return (T) Long.valueOf(val);
        }else if(clazz==Double.class){
        	return (T) Double.valueOf(val);
        }else if(clazz==Integer.class || clazz == int.class){
        	return (T) Integer.valueOf(val);
        }else if(clazz == Date.class){
        	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        	return (T) format.parse(val);
        }
        
        return (T) new BigDecimal(val);
	}
	
	public static String toLowerCase(byte[] bs) {
		for(int i=0, length=bs.length; i<length; ++i){
			if(bs[i]>='A'&&bs[i]<='Z'){
				bs[i]+=32;
			}
		}
		
		return new String(bs);
	}
}

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部