<?xml version="1.0" encoding="UTF-8"?>
<Users>
<user>
<id>1</id>
<name>张氏</name>
<user>
<id>11</id>
<name>张一</name>
<user>
<id>111</id>
<name>张一的儿子</name>
</user>
</user>
<user>
<id>2</id>
<name>张二</name>
<user>
<id>22</id>
<name>张二的儿子</name>
</user>
</user>
</user>
</Users>
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
@RestController
public class XmlController {
// 文件路径
String path = "c1.xml";
// 获取Xml数据结构
@GetMapping("getXml")
public Object getXml() {
ArrayList<Object> arrayList = new ArrayList<>();
// 读取xml文件
Document document = getDocument(path);
// 获取根节点(此处为Users)
Element root = document.getRootElement();
// 获取根节点下的全部子节点(此处为user)
List<Element> elements = root.elements();
// 遍历跟节点下的子节点
for (Element element : elements) {
// 获取当前节点名字
String name = element.getName();
// 节点名字是user就遍历节点下面的字节点
if (name.equals("user")) {
LinkedHashMap<String, Object> map = printUser(element);
arrayList.add(map);
}
}
return arrayList;
}
public static LinkedHashMap<String, Object> printUser(Element elements) {
// 存放节点
LinkedHashMap<String, Object> nodeMap = new LinkedHashMap<>();
ArrayList<Object> arrayList = new ArrayList<>();
List<Element> elementList = elements.elements();
for (Element element : elementList) {
String name = element.getName();
if (name.equals("user")) {
// 节点名字是user遍历,得到子节点,存放到nodeMap中,结束本次循环
LinkedHashMap<String, Object> map = printUser(element);
arrayList.add(map);
nodeMap.put("child", arrayList);
continue;
}
String text = element.getText();
nodeMap.put(name, text);
}
return nodeMap;
}
/**
* 根据id删除整个节点,大致为 父节点.remove(字节点),所有遍历时需要传递父节点
*
* @return
*/
@GetMapping("delete")
public Object deleteNode() {
// 需要删除的节点id
String id = "111";
Boolean falg = true;
// 读取xml文件
Document document = getDocument(path);
// 获取根节点(此处为Users)
Element root = document.getRootElement();
// 获取根节点下的全部子节点(此处为user)
List<Element> elements = root.elements();
// 遍历跟节点下的子节点
for (Element element : elements) {
// 获取当前节点名字
String name = element.getName();
// 节点名字是user就遍历节点下面的字节点
if (name.equals("user")) {
falg = deleteNode(root, element, id);
// 写道源文件中
writeToFile(document,path);
}
}
return falg ;
}
public Boolean deleteNode(Element root, Element elements, String id) {
boolean falg = true;
List<Element> elementList = elements.elements();
for (Element element : elementList) {
String key = element.getName();
String value = element.getText();
if (key.equals("id")) {
if (value.equals(id)) {
falg = root.remove(elements);
}
}
if (key.equals("user")) {
// 节点名字是user遍历,得到子节点,存放到nodeMap中,结束本次循环
deleteNode(elements, element, id);
continue;
}
}
return falg;
}
/**
* 根据id在某个节点下添加子节点(给张二添加女儿)
* 修改节点值,同理,不过有些情况需要删除节点,在添加节点,值
* @return
*/
@GetMapping("add")
public void add(){
String id="2";
// 读取xml文件
Document document = getDocument(path);
// 获取根节点(此处为Users)
Element root = document.getRootElement();
// 获取根节点下的全部子节点(此处为user)
List<Element> elements = root.elements();
// 遍历跟节点下的子节点
for (Element element : elements) {
// 获取当前节点名字
String name = element.getName();
// 节点名字是user就遍历节点下面的字节点
if (name.equals("user")) {
addNode(element,id);
// 写道源文件中
writeToFile(document,path);
}
}
}
private void addNode(Element elements,String id) {
List<Element> elementList = elements.elements();
for (Element element : elementList) {
String key = element.getName();
String value = element.getText();
if (key.equals("id")) {
if (value.equals(id)) {
// id相等,就for循环里面子节点的父节点,添加节点
Element user = elements.addElement("user");
Element id1 = user.addElement("id");
// 添加一个没什么用的属性
id1.addAttribute("说明","添加成功");
id1.addText("222");
Element name = user.addElement("name");
name.addText("张二的女儿");
}
}
if (key.equals("user")) {
addNode(element,id);
continue;
}
}
}
/**
* 获取Document对象
*
* @param path
* @return
* @throws DocumentException
*/
public Document getDocument(String path) {
Document document = null;
try {
// 1.需要通过SAXReader流加载XML文件
SAXReader saxReader = new SAXReader();
// 2.获取Document文件
document = saxReader.read(path);
} catch (DocumentException e) {
System.out.println("读取失败");
e.printStackTrace();
}
return document;
}
// 写出到源文件
public static void writeToFile(Document document, String path) {
try {
// 1.创建输出格式
OutputFormat prettyPrint = OutputFormat.createPrettyPrint();
// 2.创建流 XMLWite()
XMLWriter xmlWriter = new XMLWriter(new FileWriter(path), prettyPrint);
// 3.写出
xmlWriter.write(document);
// 4.刷出
xmlWriter.flush();
// 5.关闭
xmlWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}