使用到的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 ----
}