XML转Bean 三种实现方式

使用到的Maven依赖


		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.24</version>
		</dependency>

		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.5</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
		<dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j</artifactId>
			<version>1.6.1</version>
		</dependency> 
		
		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.16.14</version>
			<scope>provided</scope>
		</dependency>
		
		<!--json-lib -->
		<dependency>
			<groupId>net.sf.json-lib</groupId>
			<artifactId>json-lib</artifactId>
			<version>2.4</version>
			<classifier>jdk15</classifier>
		</dependency>
		
		<dependency>
		    <groupId>xom</groupId>
		    <artifactId>xom</artifactId>
		    <version>1.2.5</version>
		</dependency>

		<dependency>  
		    <groupId>com.google.code.gson</groupId>  
		    <artifactId>gson</artifactId>  
		    <version>2.8.2</version>  
		</dependency>

具体代码


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<BillPojo> 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> T toBeanOne(File file,Class<T> 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> T toBeanTwo(File file,Class<T> 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<Element> 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>) element.elements()){
			json.put(ele.getName(),ele.getStringValue());
		}
		return json;
	}
	// ---- 第二种 End ----
	
	// ---- 第三种 Begin ----
	
	/**
	 * 通过反射实现XML转换实例数组
	 * @param file
	 * @param cls
	 * @param xmlNodeName
	 * @return
	 * @throws Exception
	 */
	static <T> List<T> toBeans(File file,Class<T> cls,String xmlNodeName) throws Exception{
		Element root = getRootElement(file);
		Element element = getElement(root, xmlNodeName);
		List<Element> elements = element.elements();
		List<T> 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> T toBeanThree(Class<T> cls,Element element) throws Exception{
		T obj = cls.newInstance();
		for(Element ele : (List<Element>)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<Element>)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 ----
	
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值