基于Dom4j2的XML组装和解析
一、组装
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
/**
* @comment:XML组装
* @author 傅里叶级数
*/
public class XmlPack {
/**
* @comment: 需求,创建一个学生信息的XML,学生信息为:姓名、年龄、性别、学校
* @param:
* @author: 傅里叶级数
*/
public static void main(String[] args) {
// 1.创建文档
Document doc = DocumentHelper.createDocument();
// 2.创建根元素
Element root = doc.addElement("STUDENTS");
// 3.获取学生信息表数据,根据学生数据List遍历添加学生信息
List<Map<String,Object>> listStu = getStuInfo();
if(listStu!=null && listStu.size()>0) {
for (Map<String, Object> map : listStu) {
Element student = root.addElement("STUDENT");
student.addElement("NAME").setText(map.get("name") ==null?"":map.get("name").toString());
student.addElement("AGE").setText(map.get("age") ==null?"":map.get("age").toString());
student.addElement("SEX").setText(map.get("sex") ==null?"":map.get("sex").toString());
student.addElement("SCHOOL").setText(map.get("school") ==null?"":map.get("school").toString());
}
}
/*
* 4.将组装好的xml输出为文件
*/
//设置输出格式
OutputFormat format = OutputFormat.createPrettyPrint();
//设置文件编码
format.setEncoding("UTF-8");
//将文档document输出到指定XML文件中并关闭XMLWriter对象
try {
XMLWriter xml = new XMLWriter(new FileOutputStream("students.xml"),format);
//设置将文本中的特殊字符不需要转义
xml.setEscapeText(false);
xml.write(doc);
xml.flush();
xml.close();
System.out.println("完成");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @comment: 组装学生信息
* @param:
* @author: 傅里叶级数
*/
public static List<Map<String,Object>> getStuInfo(){
List<Map<String,Object>> listStu = new ArrayList<>();
Map<String,Object> st1 = new HashMap<>();
st1.put("name", "张三");
st1.put("age", 14);
st1.put("sex", '男');
st1.put("school", "华水");
Map<String,Object> st2 = new HashMap<>();
st2.put("name", "李四");
st2.put("age", 34);
st2.put("sex", '男');
st2.put("school", null);
Map<String,Object> st3 = new HashMap<>();
st3.put("name", "王萌萌");
st3.put("age", 18);
st3.put("sex", '女');
st3.put("school", "郑航");
Map<String,Object> st4 = new HashMap<>();
st4.put("name", "田甜甜");
st4.put("age", 17);
st4.put("sex", null);
st4.put("school", "华水");
Map<String,Object> st5 = new HashMap<>();
st5.put("name", "王五");
st5.put("age", 23);
st5.put("sex", '男');
st5.put("school", "轻工业");
Map<String,Object> st6 = new HashMap<>();
st6.put("name", "路人甲");
st6.put("age", null);
st6.put("sex", null);
st6.put("school", "");
listStu.add(st1);
listStu.add(st2);
listStu.add(st3);
listStu.add(st4);
listStu.add(st5);
listStu.add(st6);
return listStu;
}
}
组装结果:students.xml
<?xml version="1.0" encoding="UTF-8"?>
<STUDENTS>
<STUDENT>
<NAME>张三</NAME>
<AGE>14</AGE>
<SEX>男</SEX>
<SCHOOL>华水</SCHOOL>
</STUDENT>
<STUDENT>
<NAME>李四</NAME>
<AGE>34</AGE>
<SEX>男</SEX>
<SCHOOL></SCHOOL>
</STUDENT>
<STUDENT>
<NAME>王萌萌</NAME>
<AGE>18</AGE>
<SEX>女</SEX>
<SCHOOL>郑航</SCHOOL>
</STUDENT>
<STUDENT>
<NAME>田甜甜</NAME>
<AGE>17</AGE>
<SEX></SEX>
<SCHOOL>华水</SCHOOL>
</STUDENT>
<STUDENT>
<NAME>王五</NAME>
<AGE>23</AGE>
<SEX>男</SEX>
<SCHOOL>轻工业</SCHOOL>
</STUDENT>
<STUDENT>
<NAME>路人甲</NAME>
<AGE></AGE>
<SEX></SEX>
<SCHOOL></SCHOOL>
</STUDENT>
</STUDENTS>
二、解析
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* @comment: 使用Dom4j2 进行XML解析
* @author 傅里叶级数
*/
public class XmlOutput {
/**
* @comment: 使用Dom4j2进行XML解析
* @param:
* @author: 傅里叶级数
*/
public static void main(String[] args) {
// 1.SAXReader可以通过多种方式读取xml数据,并返回Document格式的对象。通过查看源码,可以看出read()方法接收File,InputStream和URL等格式的参数来读取相应的xml数据。在代码里我演示了读取xml文档和xml格式的字符串两种方式。当然,字符串要根据相应的编码转成输入流才能被SAXReader读取
SAXReader reader = new SAXReader();
// 2.定义结果集
List<Map<String,Object>> listMap = new ArrayList<>();
// 3.获取xml文件
File file = new File("students.xml");
try {
// 4.将file中的内容读取成文件
Document doc = reader.read(file);
// 5.获取根节点
Element root = doc.getRootElement();
// 6.使用迭代输出
for (Iterator<?> it = root.elementIterator(); it.hasNext();) {
Element foo = (Element) it.next();
Map<String,Object> map = new HashMap<>();
map.put("name", foo.elementText("NAME"));
map.put("age", foo.elementText("AGE"));
map.put("sex", foo.elementText("SEX"));
map.put("school", foo.elementText("SCHOOL"));
listMap.add(map);
}
System.out.println(listMap);
} catch (Exception e) {
System.out.println(e.getMessage());
}finally {
// 7.解析完成之后将对象设置为空,方面GC快速回收
reader=null;
file = null;
}
}
}
运行结果:
[{school=华水, sex=男, name=张三, age=14}, {school=, sex=男, name=李四, age=34}, {school=郑航, sex=女, name=王萌萌, age=18}, {school=华水, sex=, name=田甜甜, age=17}, {school=轻工业, sex=男, name=王五, age=23}, {school=, sex=, name=路人甲, age=}]