package com.winning.batsvi.core.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.tree.BaseElement;
import org.dom4j.tree.DefaultDocument;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* @author
* 处理xml工具类
*/
@Slf4j
public class HzzxXmlUtil {
public static final String[] FIX_ELEMENT = new String[]{
"BUSINESS_ID"
, "ORGANIZATION_CODE"
, "UPDATE_DATE"
, "DATAGENERATE_DATE"
, "ORGANIZATION_NAME"
, "BASIC_ACTIVE_ID"
, "RECORD_IDEN"
, "DOMAIN_CODE"
, "SERIALNUM_ID"
, "ARCHIVE_DATE"
, "CREATE_DATE"
, "BATCH_NUM"
, "LOCAL_ID"
, "TASK_ID"};
/**
* 对象数组转化为xml(rootElement为root)对象
*
* @param enterList 对象数组
* @param listName 数组对应标签名
* @param flag 是否添加固定内容
* @param <T>
* @return
* @throws Exception
*/
public static <T> Document parserMultiple(List<T> enterList, String listName, boolean flag) throws Exception {
if (CollectionUtils.isEmpty(enterList)) {
return null;
}
List<Element> fixElements = null;
if (flag) {
//固定的Element
fixElements = new ArrayList<>();
for (String s : FIX_ELEMENT) {
fixElements.add(new BaseElement(s));
}
}
Class<?> aClass = enterList.get(0).getClass();
Field[] declaredFields = aClass.getDeclaredFields();
List<List<Element>> elementLists = new ArrayList<>();
// 对象属性 转化为 Element,存放list中
for (Object enter : enterList) {
List<Element> elementList = new ArrayList<>();
if (fixElements != null){
elementList.addAll(fixElements);
}
for (Field field : declaredFields) {
field.setAccessible(true);
String name = field.getName();
Element element = new BaseElement(name);
if (field.get(enter) != null) {
String text = field.get(enter).toString();
element.setText(text);
}
elementList.add(element);
}
elementLists.add(elementList);
}
Document document = new DefaultDocument(new BaseElement("root"));
Element rootElement = document.getRootElement();
for (List<Element> elementList : elementLists) {
Element element = rootElement.addElement(listName);
for (Element element1 : elementList) {
element.add((Element) element1.clone());
}
}
return document;
}
/**
* 输出优美格式xml日志
*
* @param document
* @return
* @throws IOException
*/
public static void printPrettyLog(Document document) {
try {
OutputFormat format = new OutputFormat();
format.setIndentSize(2); // 缩进空格个数
format.setNewlines(true); // 新行
format.setTrimText(true); // 修剪文字
format.setPadText(true); // 文字填充
format.setEncoding("UTF-8");
StringWriter writer = new StringWriter();
XMLWriter xmlWriter = new XMLWriter(writer, format);
xmlWriter.write(document);
xmlWriter.flush();
log.info("生成的的xml信息为,{}", writer);
} catch (Exception e) {
log.info(e.getMessage());
}
}
/**
* xml对象转成String(紧凑格式)
*
* @param document
* @return
* @throws IOException
*/
public static String createCompactFormat(Document document) {
try {
OutputFormat format = new OutputFormat();
format.setIndent(false); // 缩排
format.setNewlines(false); // 新行
format.setTrimText(true); // 修剪文字
format.setEncoding("UTF-8");
StringWriter writer = new StringWriter();
XMLWriter xmlWriter = new XMLWriter(writer, format);
xmlWriter.write(document);
xmlWriter.flush();
return writer.toString();
} catch (Exception e) {
log.error("xml紧凑格式转化失败,{}", e);
}
return document.asXML();
}
/**
* String转xml根节点对象
*
* @param returnXmlString
* @return
*/
public static Document getXmlElement(String returnXmlString) throws Exception {
Document document = null;
SAXReader reader = new SAXReader();
try (InputStream is = new ByteArrayInputStream(returnXmlString.getBytes("utf8"))) {
// 命令阅读器从输入流中读取文档对象
document = reader.read(is);
return document;
}
}
/**
* 读取resources下的xml文件
*
* @param resourcesPath
* @return
*/
public static Document getXmlDocument(String resourcesPath) {
log.info("开始加载xml资源,xml路径{}", resourcesPath);
InputStream in = HzzxServiceImpl.class.getClassLoader().getResourceAsStream(resourcesPath);
// 使用dom4j读取xml
SAXReader saxReader = new SAXReader();
Document document = null;
try {
document = saxReader.read(in);
} catch (DocumentException e) {
log.error("加载xml资源失败,xml路径{}", resourcesPath);
}
return document;
}
}
注意:
element.add((Element) element1.clone());//每个element对象只能添加一次