Utils----XMLUtils将List<Map<>>数据写到xml文件以及读取xml文件到List

package koal.memory.encryptedblobstore.common;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.*;
import java.util.*;

/**
 * 将List<Map<String,String>存储到XML文件中,
 * 以及将XML文件中的数据读取到List
 *
 * @Author lidonggui
 * @Date 2021/7/13 16:15
 * @Version 1.0
 */
public class XMLUtils {


    /**
     * 将list数据写入到xml文件
     *
     * @param list
     * @param XMLPath xml文件路径
     * @return
     */
    public static void ListToXML(List<Map<String, String>> list, String XMLPath) {
        Document doc = DocumentHelper.createDocument();

//        去除list中重复的map的key
        list = repeat(list);

        //添加元素和根节点
        doc = writeXML(doc, list);

        //实例化输出格式对象

        OutputFormat format = OutputFormat.createPrettyPrint();

        //设置输出编码

        format.setEncoding("UTF-8");

        //创建需要写入的File对象

        File file = new File(XMLPath);

        //生成XMLWriter对象,构造函数中的参数为需要输出的文件流和格式

        XMLWriter writer = null;
        try {
            writer = new XMLWriter(new FileOutputStream(file), format);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        //开始写入,write方法中包含上面创建的Document对象

        try {
            writer.write(doc);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("写入成功");

    }

    /**
     * 去除list中map的key重复的值,后添加的覆盖前添加的
     *
     * @param list 待去重的list
     * @return
     */
    public static List<Map<String, String>> repeat(List<Map<String, String>> list) {
        ListIterator<Map<String, String>> mapListIterator = list.listIterator();

        HashMap<String, String> map = new HashMap<>();
//        将指针移动到末尾
        while (mapListIterator.hasNext()) {
            mapListIterator.next();
        }
//        倒序遍历保证后添加的能保存下来
        while (mapListIterator.hasPrevious()) {
            Map<String, String> previous = mapListIterator.previous();
            String flag = (String) map.put(previous.get("key"), "tag");
            if (flag != null) {
                mapListIterator.remove();
            }
        }
        return list;
    }

    /**
     * 增加节点
     *
     * @param doc
     * @param list
     * @return
     */
    public static Document writeXML(Document doc, List<Map<String, String>> list) {

        //增加根节点

        Element books = doc.addElement("stores");

        Iterator<Map<String, String>> iterator = list.iterator();
        int i = 0;
        while (iterator.hasNext()) {
            Map<String, String> next = iterator.next();
            Element store1 = books.addElement("store");
            store1.addAttribute("id", String.valueOf(i));
            for (Map.Entry<String, String> entry : next.entrySet()) {

                Element key = store1.addElement(entry.getKey());
                key.setText(entry.getValue());

            }
            i++;
        }

        return books.getDocument();
    }


    /**
     * 将xml文件读取到List
     *
     * @param XMLPath xml文件路径
     */
    public static List<Map<String, String>> XmlToList(String XMLPath) {

        List<Map<String, String>> list = new ArrayList<>();
        SAXReader reader = new SAXReader();
        File file = new File(XMLPath);
        Document document = null;
        try {
            document = reader.read(file);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        Element root = document.getRootElement();
        List<Element> childElements = root.elements();
        for (Element child : childElements) {
            Map map = new HashMap();
            //未知属性名情况下
            /*List<Attribute> attributeList = child.attributes();
            for (Attribute attr : attributeList) {
                System.out.println(attr.getName() + ": " + attr.getValue());
            }*/
            //已知属性名情况下
//            System.out.println("id: " + child.attributeValue("id"));
            //未知子元素名情况下
            /*List<Element> elementList = child.elements();
            for (Element ele : elementList) {
                System.out.println(ele.getName() + ": " + ele.getText());
            }
            System.out.println();*/
            //已知子元素名的情况下
            map.put("key", child.elementText("key"));
//            System.out.println("key" + child.elementText("key"));
            map.put("val", child.elementText("val"));
//            System.out.println("val" + child.elementText("val"));
            list.add(map);
        }
        return list;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值