1. <?xml version="1.0" encoding="UTF-8"?>
    2. <Users>
    3. <user>
    4. <id>1</id>
    5. <name>张氏</name>
    6. <user>
    7. <id>11</id>
    8. <name>张一</name>
    9. <user>
    10. <id>111</id>
    11. <name>张一的儿子</name>
    12. </user>
    13. </user>
    14. <user>
    15. <id>2</id>
    16. <name>张二</name>
    17. <user>
    18. <id>22</id>
    19. <name>张二的儿子</name>
    20. </user>
    21. </user>
    22. </user>
    23. </Users>
    1. import org.dom4j.Document;
    2. import org.dom4j.DocumentException;
    3. import org.dom4j.Element;
    4. import org.dom4j.io.OutputFormat;
    5. import org.dom4j.io.SAXReader;
    6. import org.dom4j.io.XMLWriter;
    7. import org.springframework.web.bind.annotation.GetMapping;
    8. import org.springframework.web.bind.annotation.RestController;
    9. import java.io.FileWriter;
    10. import java.io.IOException;
    11. import java.util.ArrayList;
    12. import java.util.LinkedHashMap;
    13. import java.util.List;
    14. @RestController
    15. public class XmlController {
    16. // 文件路径
    17. String path = "c1.xml";
    18. // 获取Xml数据结构
    19. @GetMapping("getXml")
    20. public Object getXml() {
    21. ArrayList<Object> arrayList = new ArrayList<>();
    22. // 读取xml文件
    23. Document document = getDocument(path);
    24. // 获取根节点(此处为Users)
    25. Element root = document.getRootElement();
    26. // 获取根节点下的全部子节点(此处为user)
    27. List<Element> elements = root.elements();
    28. // 遍历跟节点下的子节点
    29. for (Element element : elements) {
    30. // 获取当前节点名字
    31. String name = element.getName();
    32. // 节点名字是user就遍历节点下面的字节点
    33. if (name.equals("user")) {
    34. LinkedHashMap<String, Object> map = printUser(element);
    35. arrayList.add(map);
    36. }
    37. }
    38. return arrayList;
    39. }
    40. public static LinkedHashMap<String, Object> printUser(Element elements) {
    41. // 存放节点
    42. LinkedHashMap<String, Object> nodeMap = new LinkedHashMap<>();
    43. ArrayList<Object> arrayList = new ArrayList<>();
    44. List<Element> elementList = elements.elements();
    45. for (Element element : elementList) {
    46. String name = element.getName();
    47. if (name.equals("user")) {
    48. // 节点名字是user遍历,得到子节点,存放到nodeMap中,结束本次循环
    49. LinkedHashMap<String, Object> map = printUser(element);
    50. arrayList.add(map);
    51. nodeMap.put("child", arrayList);
    52. continue;
    53. }
    54. String text = element.getText();
    55. nodeMap.put(name, text);
    56. }
    57. return nodeMap;
    58. }
    59. /**
    60. * 根据id删除整个节点,大致为 父节点.remove(字节点),所有遍历时需要传递父节点
    61. *
    62. * @return
    63. */
    64. @GetMapping("delete")
    65. public Object deleteNode() {
    66. // 需要删除的节点id
    67. String id = "111";
    68. Boolean falg = true;
    69. // 读取xml文件
    70. Document document = getDocument(path);
    71. // 获取根节点(此处为Users)
    72. Element root = document.getRootElement();
    73. // 获取根节点下的全部子节点(此处为user)
    74. List<Element> elements = root.elements();
    75. // 遍历跟节点下的子节点
    76. for (Element element : elements) {
    77. // 获取当前节点名字
    78. String name = element.getName();
    79. // 节点名字是user就遍历节点下面的字节点
    80. if (name.equals("user")) {
    81. falg = deleteNode(root, element, id);
    82. // 写道源文件中
    83. writeToFile(document,path);
    84. }
    85. }
    86. return falg ;
    87. }
    88. public Boolean deleteNode(Element root, Element elements, String id) {
    89. boolean falg = true;
    90. List<Element> elementList = elements.elements();
    91. for (Element element : elementList) {
    92. String key = element.getName();
    93. String value = element.getText();
    94. if (key.equals("id")) {
    95. if (value.equals(id)) {
    96. falg = root.remove(elements);
    97. }
    98. }
    99. if (key.equals("user")) {
    100. // 节点名字是user遍历,得到子节点,存放到nodeMap中,结束本次循环
    101. deleteNode(elements, element, id);
    102. continue;
    103. }
    104. }
    105. return falg;
    106. }
    107. /**
    108. * 根据id在某个节点下添加子节点(给张二添加女儿)
    109. * 修改节点值,同理,不过有些情况需要删除节点,在添加节点,值
    110. * @return
    111. */
    112. @GetMapping("add")
    113. public void add(){
    114. String id="2";
    115. // 读取xml文件
    116. Document document = getDocument(path);
    117. // 获取根节点(此处为Users)
    118. Element root = document.getRootElement();
    119. // 获取根节点下的全部子节点(此处为user)
    120. List<Element> elements = root.elements();
    121. // 遍历跟节点下的子节点
    122. for (Element element : elements) {
    123. // 获取当前节点名字
    124. String name = element.getName();
    125. // 节点名字是user就遍历节点下面的字节点
    126. if (name.equals("user")) {
    127. addNode(element,id);
    128. // 写道源文件中
    129. writeToFile(document,path);
    130. }
    131. }
    132. }
    133. private void addNode(Element elements,String id) {
    134. List<Element> elementList = elements.elements();
    135. for (Element element : elementList) {
    136. String key = element.getName();
    137. String value = element.getText();
    138. if (key.equals("id")) {
    139. if (value.equals(id)) {
    140. // id相等,就for循环里面子节点的父节点,添加节点
    141. Element user = elements.addElement("user");
    142. Element id1 = user.addElement("id");
    143. // 添加一个没什么用的属性
    144. id1.addAttribute("说明","添加成功");
    145. id1.addText("222");
    146. Element name = user.addElement("name");
    147. name.addText("张二的女儿");
    148. }
    149. }
    150. if (key.equals("user")) {
    151. addNode(element,id);
    152. continue;
    153. }
    154. }
    155. }
    156. /**
    157. * 获取Document对象
    158. *
    159. * @param path
    160. * @return
    161. * @throws DocumentException
    162. */
    163. public Document getDocument(String path) {
    164. Document document = null;
    165. try {
    166. // 1.需要通过SAXReader流加载XML文件
    167. SAXReader saxReader = new SAXReader();
    168. // 2.获取Document文件
    169. document = saxReader.read(path);
    170. } catch (DocumentException e) {
    171. System.out.println("读取失败");
    172. e.printStackTrace();
    173. }
    174. return document;
    175. }
    176. // 写出到源文件
    177. public static void writeToFile(Document document, String path) {
    178. try {
    179. // 1.创建输出格式
    180. OutputFormat prettyPrint = OutputFormat.createPrettyPrint();
    181. // 2.创建流 XMLWite()
    182. XMLWriter xmlWriter = new XMLWriter(new FileWriter(path), prettyPrint);
    183. // 3.写出
    184. xmlWriter.write(document);
    185. // 4.刷出
    186. xmlWriter.flush();
    187. // 5.关闭
    188. xmlWriter.close();
    189. } catch (IOException e) {
    190. e.printStackTrace();
    191. }
    192. }
    193. }