dom4j 解析xml
添加依赖
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
工具类
package com.example.easyexcel.util;
import cn.hutool.core.util.URLUtil;
import org.apache.poi.util.StringUtil;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class XmlUtil {
/**
* jdk 自带的工具
* 将Map转换为XML格式的字符串
*
* @param data Map类型数据
* @return XML格式的字符串
* @throws Exception
*/
public static String mapToXml(Map<String, String> data) throws Exception {
org.w3c.dom.Document document = newDocument();
org.w3c.dom.Element root = document.createElement("xml");
document.appendChild(root);
for (String key : data.keySet()) {
String value = data.get(key);
if (value == null) {
value = "";
}
value = value.trim();
org.w3c.dom.Element filed = document.createElement(key);
filed.appendChild(document.createTextNode(value));
root.appendChild(filed);
}
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
DOMSource source = new DOMSource(document);
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
transformer.transform(source, result);
String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
try {
writer.close();
} catch (Exception ex) {
}
return output;
}
/**
* jdk 自带的工具
* XML格式字符串转换为Map
*
* @param strXML XML字符串
* @return XML数据转换后的Map
* @throws Exception
*/
public static Map<String, String> xmlToMap(String strXML) throws Exception {
try {
Map<String, String> data = new HashMap<String, String>();
DocumentBuilder documentBuilder = newDocumentBuilder();
InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
org.w3c.dom.Document doc = documentBuilder.parse(stream);
doc.getDocumentElement().normalize();
NodeList nodeList = doc.getDocumentElement().getChildNodes();
for (int idx = 0; idx < nodeList.getLength(); ++idx) {
Node node = nodeList.item(idx);
if (node.getNodeType() == Node.ELEMENT_NODE) {
org.w3c.dom.Element element = (org.w3c.dom.Element) node;
data.put(element.getNodeName(), element.getTextContent());
}
}
try {
stream.close();
} catch (Exception ex) {
// do nothing
}
return data;
} catch (Exception ex) {
XmlUtil.getLogger().warn("Invalid XML, can not convert to map. Error message: {}. XML content: {}", ex.getMessage(), strXML);
throw ex;
}
}
/**
* dom4j 进行导出
* @param maps
* @param elementName
*/
public static void exportXml(List<Map<String, Object>> maps, String elementName,HttpServletResponse response) {
//我们需要英文换成换成驼峰形式
org.dom4j.Document document = DocumentHelper.createDocument();
org.dom4j.Element result = document.addElement("result");
for (int i = 0; i < maps.size(); i++) {
//添加序号节点
//Element element = result.addElement(i + 1 + "");
//添加对象节点
Element data = result.addElement(elementName);
Map<String, Object> map = maps.get(i);
for (String k : map.keySet()) {
//将数据添加到对象节点之下
data.addElement(k).setText(map.get(k)+"");
}
}
//FileWriter out = null;
ServletOutputStream out = null;
String fileName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHH")) + ".xml";
try {
out = response.getOutputStream();
//out = new FileWriter(path + File.separator + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHH")) + ".xml");
response.setContentType("multipart/form-data");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename="+ URLUtil.encode(fileName, StringUtil.UTF8));
OutputFormat xmlFormat = new OutputFormat();
xmlFormat.setEncoding("UTF-8");
xmlFormat.setNewlines(true);
// 生成缩进
xmlFormat.setIndent(true);
// 使用4个空格进行缩进, 可以兼容文本编辑器
xmlFormat.setIndent(" ");
XMLWriter writer = new XMLWriter(out, xmlFormat);
writer.write(document);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 日志
*
* @return
*/
public static Logger getLogger() {
Logger logger = LoggerFactory.getLogger("wxpay java sdk");
return logger;
}
public static DocumentBuilder newDocumentBuilder() throws ParserConfigurationException {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
documentBuilderFactory.setXIncludeAware(false);
documentBuilderFactory.setExpandEntityReferences(false);
return documentBuilderFactory.newDocumentBuilder();
}
public static Document newDocument() throws ParserConfigurationException {
return newDocumentBuilder().newDocument();
}
}
web测试
package com.example.easyexcel.xml;
import com.example.easyexcel.util.XmlUtil;
import com.example.easyexcel.work.service.IUserService;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* dom4j 导入导出 格式xml
*
* 参考文档1: https://www.cnblogs.com/hongwz/p/5514786.html
*/
@RestController
public class XmlController {
@Autowired
private IUserService userService;
/**
* xml 导出
* @param response
*/
@GetMapping("exportXml")
public void exportXml(HttpServletResponse response) {
List<Map<String, Object>> list = userService.listMaps();
XmlUtil.exportXml(list, "user", response);
}
/**
* xml导入
* @param file
* @throws Exception
*/
@PostMapping("importXml")
public void importXml(MultipartFile file) throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(file.getInputStream());
Element rootElement = document.getRootElement();
System.out.println("根节点名字:" + rootElement.getName());
List<Element> elements = rootElement.elements();
elements.forEach(element -> {
System.out.println(element.elementText("user_name"));
System.out.println(element.elementText("age"));
System.out.println(element.elementText("sex"));
System.out.println(element.elementText("phone"));
System.out.println(element.elementText("address"));
System.out.println(element.elementText("birthday"));
System.out.println(element.elementText("create_time"));
System.out.println("#####################################");
});
}
}