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;
}
}
Utils----XMLUtils将List<Map<>>数据写到xml文件以及读取xml文件到List
最新推荐文章于 2023-08-07 14:17:51 发布