前言
对于少量数据或配置信息,可通过xml文件进行管理。xml可以运用标签实现类似数据库一样的数据管理。一些配置信息,比如文件保存路径,如果将这些配置写入yml文件后读不到的话,也可以试着写入xml文件。
代码
<!--导入依赖-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
public class XmlUtil {
// xml文件名
private static String xmlFileName = "pmp测试题答题情况记录.xml";
public static boolean createXmlFile(Map<String,String> dataMap){
/**
* dataMap 为写入xml的数据,key为标签名,value为实际值
*/
XMLWriter writer = null;
try {
// 生成一个Document对象
Document doc = DocumentHelper.createDocument();
// 添加根元素 pmpAnswerRecord可替换为其他名称
Element root = doc.addElement("pmpAnswerRecord");
// 为根元素添加子元素
// 二级根元素名称 alreadyAnswer可替换为其他名称
Element rootSecond = root.addElement("alreadyAnswer");
Set key = dataMap.keySet();
for (Object k : key) {
rootSecond.addElement(k.toString()).setText(String.valueOf(dataMap.get(k)));
}
// 输出xml文件
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(xmlFileName),"UTF-8"),format);
writer.write(doc);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}finally {
// 关闭资源
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 读取xml文件数据
* 读取时跳过第一级和第二级目录
*/
public static Map<String,String> readXmlFile(){
File file = new File(xmlFileName);
if (!file.exists()) {
return null;
}
try {
Map<String,String> resMap = new HashMap<>();
SAXReader reader = new SAXReader();
Document dc = reader.read(file);
//获取根节点
Element rootElement = dc.getRootElement();
Iterator<Element> iterator = rootElement.elementIterator();
while (iterator.hasNext()) {
Element book = iterator.next();
Iterator<Element> elementIterator = book.elementIterator();
while (elementIterator.hasNext()) {
Element next = elementIterator.next();
resMap.put(next.getName(),next.getText());
}
}
return resMap;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<pmpAnswerRecord>
<alreadyAnswer>
<falseNumber>9</falseNumber>
<trueNumber>15</trueNumber>
<questionNumber>25</questionNumber>
</alreadyAnswer>
</pmpAnswerRecord>