<?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;@RestControllerpublic 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(); } }}