XML转Bean 三种实现方式

使用到的Maven依赖


		
			com.alibaba
			fastjson
			1.2.24
		

		
			commons-io
			commons-io
			2.5
		

		
		
			dom4j
			dom4j
			1.6.1
		 
		
		
		
			org.projectlombok
			lombok
			1.16.14
			provided
		
		
		
		
			net.sf.json-lib
			json-lib
			2.4
			jdk15
		
		
		
		    xom
		    xom
		    1.2.5
		

		  
		    com.google.code.gson  
		    gson  
		    2.8.2  
		

具体代码


import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.longsec.baoan.utils.XmlExercise;

public class MyApp {

	static String path = "D:/temp/160/2019-07-06-weixin-outPatient.txt";
	
	static String ending = "UTF-8";
	
	public static void main(String[] args) throws Exception {
		File file = new File(path);
		String xmlNodeName = "DATA.reponse.body";
		List pojos = toBeans(file, BillPojo.class, xmlNodeName);
		String jsonPath = file.getParentFile()+File.separator+"xmlToBean.json";
		StringBuffer sb = new StringBuffer();
		for (BillPojo billPojo : pojos) {
			sb.append(billPojo.toString()).append("\n");
		}
		FileUtils.write(new File(jsonPath), sb.toString(),ending);
		System.out.println(jsonPath);
		
	}
	
	// ---- 第一种 Begin ----
	/**
	 * XML转实例对象第一种
	 * gosn lib
	 * @param file
	 * @param cls
	 * @return
	 * @throws Exception
	 */
	static  T toBeanOne(File file,Class cls) throws Exception{
		String xml = FileUtils.readFileToString(file, ending);
		String jsonString = XmlExercise.xmlToJson(xml);
		Gson gson = new Gson();
		String json = gson.toJson(jsonString);
		return gson.fromJson(jsonString, cls);
	}
	// ---- 第一种 End ----
	
	// ---- 第二种 Begin ----
	/**
	 * XML转实例对象第一种
	 * 手动实现
	 * @param file
	 * @param cls
	 * @return
	 * @throws Exception
	 */
	static  T toBeanTwo(File file,Class cls) throws Exception{
		JSONObject json = readAliJson(file);
		return json.toJavaObject(cls);
	}

	/**
	 * xml转换JSON
	 * @param file
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	static JSONObject readAliJson(File file) throws Exception{
		//获取root节点
		JSONObject json = new JSONObject();
		Element rootElement = getRootElement(file);
		setJsonValue(json, "result", rootElement, "DATA.reponse.head.result");
		setJsonValue(json, "desc", rootElement, "DATA.reponse.head.desc");
		
		Element element = getElement(rootElement, "DATA.reponse.body");
		List elements = element.elements();
		JSONArray body = new JSONArray(elements.size());
		for (Element ele : elements) {
			body.add(getJsonObject(ele));
		}
		json.put("body", body);
		return json;
	}
	
	/**
	 * 提取XML属性值注入json中
	 * @param json		json实例
	 * @param jsonkey	json属性名
	 * @param eleRoot		xml节点
	 * @param xmlNodeName	xml节点名称(多层[.]分割)
	 */
	static void setJsonValue(JSONObject json,String jsonkey,Element eleRoot,String xmlNodeName){
		 
		Element element = getElement(eleRoot, xmlNodeName);
		
		if (element != null) {
			json.put(jsonkey, element.getStringValue());
		}else{
			json.put(jsonkey, "");
		}
	}
	
	/**
	 * xml转换json
	 * @param element
	 * @return
	 */
	static JSONObject getJsonObject(Element element){
		JSONObject json = new JSONObject();
		for(Element ele : (List) element.elements()){
			json.put(ele.getName(),ele.getStringValue());
		}
		return json;
	}
	// ---- 第二种 End ----
	
	// ---- 第三种 Begin ----
	
	/**
	 * 通过反射实现XML转换实例数组
	 * @param file
	 * @param cls
	 * @param xmlNodeName
	 * @return
	 * @throws Exception
	 */
	static  List toBeans(File file,Class cls,String xmlNodeName) throws Exception{
		Element root = getRootElement(file);
		Element element = getElement(root, xmlNodeName);
		List elements = element.elements();
		List list = new ArrayList<>(elements.size());
		for (Element ele : elements) {
			T obj = toBeanThree(cls,ele);
			list.add(obj);
		}
		return list;
	}
	
	/**
	 * 第三种 使用反射实现 方便自己用不同的实例还需要自己修改
	 * @param cls	不支持数组
	 * @param element	不支持数组
	 * @return
	 * @throws Exception 
	 */
	static  T toBeanThree(Class cls,Element element) throws Exception{
		T obj = cls.newInstance();
		for(Element ele : (List)element.elements()){
			String name = ele.getName();
			String filedName = toFiledName(name);
			Field field = cls.getDeclaredField(filedName);
			if (field != null) {
				field.setAccessible(true);
				//如果需要通用可以大家可以自己添加一些if进行处理
				field.set(obj, ele.getStringValue());
			}
		}
		return obj;
	}
	
	/**
	 * 驼峰转换
	 * @param str
	 * @return
	 */
	static String toFiledName(String str){
		String[] split = str.split("_");
		StringBuffer sb = new StringBuffer(split[0]);
		for (int i = 1; i < split.length; i++) {
			String string = split[i];
			sb.append(string.substring(0, 1).toUpperCase());
			if (string.length()>1) {
				sb.append(string.substring(1));
			}
		}
		return sb.toString();
	}
	
	// ---- 第三种 End ----
	
	// ---- 公共 Begin ----
	/**
	 * 从文件中读取xml
	 * @param file   
	 * @return
	 * @throws IOException
	 * @throws DocumentException
	 */
	static Element getRootElement(File file) throws IOException, DocumentException{
		String xml = FileUtils.readFileToString(file, ending);
		//dom4j解析xml
		//创建SAXReader对象 reader
		SAXReader reader = new SAXReader();
		//因为我项目中的xml文件 是查出来的,类型是字符串类型,所以我们需要把字符串转换成xml文件
		Document document = DocumentHelper.parseText(xml); //将字符串转换成xml,具体转换 可以百度搜索 dom4j字符串转xml
		//获取文件的根节点
		return document.getRootElement();
	}
	
	/**
	 * 获取xml指定节点
	 * @param eleRoot
	 * @param xmlNodeName
	 * @return
	 */
	static Element getElement(Element eleRoot,String xmlNodeName){
		int index = xmlNodeName.indexOf(".");
		String nodeName = xmlNodeName;
		if (index !=-1) {
			//提取正确的节点名称
			nodeName = xmlNodeName.substring(0,index);
		}
		for (Element element : (List)eleRoot.elements()) {
			if (nodeName.equals(element.getName())) {
				xmlNodeName = xmlNodeName.substring(index+1,xmlNodeName.length());
				if (index !=-1) {
					return getElement(element, xmlNodeName);	
				}
				return element;
			}
		}
		return null;
	}
	
	// ---- 公共 Begin ----
	
}

 

你可能感兴趣的:(JAVA)