java解析XML 修改节点 删除节点 遍历节点 添加节点 dom4j SAXReader

案列源码,xml文件,点我跳转!

java 解析复杂xml

  • 遍历获取xml数据,返回值为树形结构
<?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>
  • 删除节点 遍历节点 添加节点
package com.air.controller;

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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值