java dom4j 解析xml

dom4j 解析xml

本demo地址:https://github.com/woyaochengweidaniu/javaEE/tree/master/file-handling
参考文档:https://www.cnblogs.com/hongwz/p/5514786.html

添加依赖

<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("
|
", "");
        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("#####################################");

        });

    }
}

原文地址:https://www.cnblogs.com/java-hardly-road/p/11158167.html