zoukankan      html  css  js  c++  java
  • 【java】dom4j 生成/解析/修改xml数据

    目录如下:

    1. maven依赖

    <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
    <dependency>
        <groupId>org.dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>2.1.1</version>
    </dependency>

    这里要注意版本号,如果版本号过低,需要额外再引入一个依赖,否则可能会导致项目启动不了。如下:

    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>jaxen</groupId>
        <artifactId>jaxen</artifactId>
        <version>1.1.1</version>
    </dependency>

    2. dom4j解析xml数据

    2.1 简单解析(一级)

    //格式:
    //<?xml version="1.0" encoding="UTF-8"?>
    //<User>
    //    <name>张三</name>
    //    <age>22</age>
    //    <sex>1</sex>
    //</User>
    
    public static void main(String[] args) {
        try{
            //创建一个xml格式的字符串
            String xmlStr = "字符串为上面的xml格式数据";
            // 创建saxReader对象
            SAXReader reader = new SAXReader();
            //解析XML形式的文本,得到document对象
            Document document = DocumentHelper.parseText(xmlStr);
            //读取文件中的数据并解析
            //Document document = reader.read(new File("test.xml"));
            //获取根节点(User)
            Element root = document.getRootElement();
            //获取根节点下子节点的值
            String name = root.elementTextTrim("name");//张三
            String age = root.elementTextTrim("age");//22
            String sex = root.elementTextTrim("sex");//1
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    2.2 复杂解析(多级)

    public static void main(String[] args) {
    
        //格式:
        //<?xml version="1.0" encoding="UTF-8"?>
        //<Users>
        //    <User>
        //        <name>张三</name>
        //        <age>22</age>
        //        <sex>1</sex>
        //    </User>
        //    <User>
        //        <name>李四</name>
        //        <age>23</age>
        //        <sex>0</sex>
        //    </User>
        //</Users>
    
        try{
            //创建一个xml格式的字符串
            String xmlStr = "字符串为上面的xml格式数据";
            // 创建saxReader对象
            SAXReader reader = new SAXReader();
            //解析XML形式的文本,得到document对象
            Document document = DocumentHelper.parseText(xmlStr);
            //获取根节点(Users)
            Element root = document.getRootElement();
            //获取根节点下子节点集合(User)
            Iterator<Element> user = root.elementIterator("User");
            while (user.hasNext()){
                Element element = (Element)user.next();
                String name = element.elementTextTrim("name");
                String age = element.elementTextTrim("age");
                String sex = element.elementTextTrim("sex");
                //结果  name=张三age=22sex=1  name=李四age=23sex=0
                System.out.println("name="+name+"age="+age+"sex="+sex);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    2.3 简单解析(带属性)

    public static void main(String[] args) {
            
        //格式:
        //<?xml version="1.0" encoding="UTF-8"?>
        //<User id="01">
        //    <name id="02">张三</name>
        //    <age>22</age>
        //    <sex>1</sex>
        //</User>
    
        try{
            //创建一个xml格式的字符串
            String xmlStr = "字符串为上面的xml格式数据";
            // 创建saxReader对象
            SAXReader reader = new SAXReader();
            //解析XML形式的文本,得到document对象
            Document document = DocumentHelper.parseText(xmlStr);
            //获取根节点(User)
            Element root = document.getRootElement();
            //获取根节点的id属性值
            String id = root.attributeValue("id");
            //获取子节点name的id值
            Element name = root.element("name");
            String name_id = name.attributeValue("id");
            //结果  name_id属性值=02
            System.out.println("name_id属性值="+name_id);
            //结果  User_id属性值=01
            System.out.println("User_id属性值="+id);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    2.4 复杂解析(不知标签和属性名称)

    public static void main(String[] args) {
        //格式:
        //<?xml version="1.0" encoding="UTF-8"?>
        //<Users>
        //    <User id="01">
        //        <name>张三</name>
        //        <age>22</age>
        //        <sex>1</sex>
        //    </User>
        //    <User id="02">
        //        <name>李四</name>
        //        <age>23</age>
        //        <sex>0</sex>
        //    </User>
        //</Users>
    
        try{
            //创建xml格式字符串
            String text = "字符串为上面的xml格式数据";
            //将字符串转为document对象
            Document document = DocumentHelper.parseText(text);
            //获取根节点
            Element rootElement = document.getRootElement();
            //获取根节点下所有子节点
            List<Element> elements = rootElement.elements();
            //循环子节点
            for (Element element : elements) {
                //获取每个子节点的所有属性值
                List<Attribute> attributes = element.attributes();
                //不知属性名   已知属性名用element.attributeValue("id")
                for (Attribute attr : attributes) {
                    //结果 id:01  id:02
                    System.out.println(attr.getName()+":"+attr.getValue());
                }
                List<Element> elementChilds = element.elements();
                for (Element elementChild : elementChilds) {
                    //结果:name:张三 age:22 sex:1 name:李四 age:23 sex:0
                    System.out.print(elementChild.getName()+":"+elementChild.getText());
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    2.5 XPath的使用

    XPath 是xml的路径语言,使用路径表达式来操作xml文档,使用XPath操作xml文档更加便捷。

    dom4j提供了两个方法支持XPath搜索:

    1. List selectNodes(String expr);

    2. Node selectSingleNode(String expr);

    Xpath表达式的几种写法:

    第一种形式: /AAA/BBB/CCC:表示层级结构,表示AAA下面BBB下面的所有CCC

    第二种形式: //BBB:选择文档中所有的BBB元素

    第三种形式: /AAA/BBB/:选择目录下的所有元素 ////BBB:选择有三个祖先元素的BBB元素 //*:选择所有的元素

    第四种形式: //AAA[1]/BBB:选择第一个AAA下的BBB元素 //AAA/BBB[1]:选择所有AAA的第一个BBB元素 //AAA/BBB[last()]:选择所有AAA的最后一个BBB元素

    第五种形式: //@id:选择所有的id属性 //BBB[@id]:选择具有id属性的BBB元素

    第六种形式: //BBB[@id='b1'] :选择含有属性id并且其值为b1的BBB元素

    需要额外的依赖:

    <!-- 使用xpath需要引入的包 -->
    <!-- https://mvnrepository.com/artifact/jaxen/jaxen -->
    <dependency>
        <groupId>jaxen</groupId>
        <artifactId>jaxen</artifactId>
        <version>1.1.6</version>
    </dependency>
    public static void main(String[] args) {
    
        //格式:
        //<?xml version="1.0" encoding="utf-8"?>
        //<classroom grade="primary5">
        //    <persons>
        //        <teacher id="1">
        //            <property name="name" value="laosi"/>
        //            <property name="age" value="24"/>
        //        </teacher>
        //
        //        <students>
        //            <student id="1">
        //                <property name="name" value="lisi"/>
        //                <property name="age" value="12"/>
        //            </student>
        //            <student id="2">
        //                <property name="name" value="zhangsan"/>
        //                <property name="age" value="12"/>
        //            </student>
        //            <student id="3">
        //                <property name="name" value="wangwu"/>
        //                <property name="age" value="12"/>
        //            </student>
        //        </students>
        //    </persons>
        //</classroom>
    
        try{
            //创建xml格式字符串
            String text = "字符串为上面的xml格式数据";
            //将字符串转为document对象
            Document document = DocumentHelper.parseText(text);
            //拿到了student的父标签 students
            Node students = document.selectSingleNode("/classroom/persons/students");
            //输出students下包含students的所有xml格式的字符串
            System.out.println(students.asXML());
            //拿到了所有的student标签
            List<Node> nodes = students.selectNodes("/classroom/persons/students/student");
            for (Node node : nodes) {
                //输出所有student且包含student层级的xml格式的字符串
                System.out.println(node.asXML());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    3. dom4j生成xml数据

    3.1 字符串方式生成xml数据

    主要思路为通过String、StringBuffer、StringBuilder拼接出来xml格式的字符串,之后转成document对象

    public static void main(String[] args) {
    
        //格式:
        //<?xml version="1.0" encoding="UTF-8"?>
        //<User>
        //    <name>张三</name>
        //    <age>22</age>
        //    <sex>1</sex>
        //</User>
    
        try{
            //创建一个xml格式的字符串
            String xmlStr = "字符串为上面的xml格式数据";
            //创建document
            Document document = DocumentHelper.parseText(xmlStr);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    3.2 document方式生成xml数据

    public static void main(String[] args) {
    
        //格式:
        //<?xml version="1.0" encoding="UTF-8"?>
        //<User>
        //    <name>张三</name>
        //    <age>22</age>
        //    <sex>1</sex>
        //</User>
    
        try{
            //创建document
            Document document = DocumentHelper.createDocument();
            //创建根节点
            Element root = DocumentHelper.createElement("User");
            document.setRootElement(root);
            //创建根节点下的三个子节点
            Element name = root.addElement("name");
            Element age = root.addElement("age");
            Element sex = root.addElement("sex");
            //为子节点赋值
            name.setText("张三");
            age.setText("22");
            sex.setText("1");
            //结果:<?xml version="1.0" encoding="UTF-8"?><User><name>张三</name><age>22</age><sex>1</sex></User>
            System.out.println(document.asXML());
            //这里要注意:如果没有为节点赋值,可能会出现下面这种单节点的形式
            //<?xml version="1.0" encoding="UTF-8"?><User><name/><age/><sex/></User>
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    3.3 生成xml数据添加属性/注释

    public static void main(String[] args) {
        try{
            //创建document
            Document document = DocumentHelper.createDocument();
            //创建根节点
            Element root = DocumentHelper.createElement("User");
            document.setRootElement(root);
            //添加注释
            root.addComment("这是根节点");
            //添加属性
            root.addAttribute("id", "01");
            //结果:<?xml version="1.0" encoding="UTF-8"?><User id="01"><!--这是根节点--></User>
            System.out.println(document.asXML());
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    3.4 输出文件

    //生成代码同上,只需传入document对象即可
    
    // 创建格式化类
    OutputFormat format = OutputFormat.createPrettyPrint();
    // 设置编码格式,默认UTF-8
    format.setEncoding("UTF-8");
    // 创建输出流,此处要使用Writer,需要指定输入编码格式,使用OutputStream则不用
    FileOutputStream fos = new FileOutputStream("d:/test.xml");
    // 创建xml输出流
    XMLWriter writer = new XMLWriter(fos, format);
    // 生成xml文件
    writer.write(document);
    writer.close();

    4. dom4j修改xml数据

    4.1 新增节点/节点值/注释/属性

    public static void main(String[] args) {
        try{
            //创建document
            Document document = DocumentHelper.createDocument();
            //创建根节点
            Element root = DocumentHelper.createElement("User");
            document.setRootElement(root);
            //添加注释
            root.addComment("这是根节点");
            //添加属性
            root.addAttribute("id", "01");
            //添加节点
            Element name = root.addElement("name");
            //添加节点值
            name.setText("张三");
            //结果:<User id="01"><!--这是根节点--><name>张三</name></User>
            System.out.println(document.asXML());
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    4.2 修改节点/节点值/注释/属性

    public static void main(String[] args) {
        try{
            //创建document
            Document document = DocumentHelper.createDocument();
            //创建根节点
            Element root = DocumentHelper.createElement("User");
            document.setRootElement(root);
            //添加注释
            root.addComment("这是根节点");
            //添加属性
            root.addAttribute("id", "01");
            //添加节点
            Element name = root.addElement("name");
            //添加节点值
            name.setText("张三");
            //结果:<User id="01"><!--这是根节点--><name>张三</name></User>
            System.out.println(document.asXML());
            //修改属性值  方法2:root.addAttribute("id", "02");
            root.setAttributeValue("id", "02");
            //修改节点值
            name.setText("李四");
            //修改注释 
    
            //结果:<User id="02"><!--这是根节点--><name>李四</name></User>
            System.out.println(document.asXML());
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    4.3 删除节点/节点值/注释/属性

    public static void main(String[] args) {
        try{
            //创建document
            Document document = DocumentHelper.createDocument();
            //创建根节点
            Element root = DocumentHelper.createElement("User");
            document.setRootElement(root);
            //添加注释
            root.addComment("这是根节点");
            //添加属性
            root.addAttribute("id", "01");
            //添加节点
            Element name = root.addElement("name");
            //添加节点值
            name.setText("张三");
            //结果:<User id="01"><!--这是根节点--><name>张三</name></User>
            System.out.println(document.asXML());
    
            //删除属性
            root.remove(root.attribute("id"));
            //删除节点值
            name.setText("");
            //删除注释
    
            //结果:<?xml version="1.0" encoding="UTF-8"?><User><!--这是根节点--><name></name></User>
            System.out.println(document.asXML());
            //删除所有注释
            //结果:<?xml version="1.0" encoding="UTF-8"?><User><name></name></User>
            System.out.println(document.asXML().replaceAll("(?s)<\!\-\-.+?\-\->", ""));
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    参考:

    1. https://blog.csdn.net/redarmy_chen/article/details/12969219

    2. https://blog.csdn.net/xf_zhen/article/details/90440330

    3. https://www.cnblogs.com/xumBlog/p/8678629.html

    4. https://blog.csdn.net/qq_40650532/article/details/90230238

  • 相关阅读:
    此网站的安全证书有问题
    WebBrowser控件打开https站点
    C# 调Win32 API SendMessage简单用法及wMsg常量
    sendmessage和postmessage的区别
    C# 使用Win32 API模拟键盘鼠标操作网页
    WebBrowser控件跨域访问页面内容
    获取webbrowser中元素的屏幕坐标
    一行js代码识别Selenium+Webdriver及其应对方案
    用Selenium自动化测试时,让ChromeDriver中不显示“正受到自动测试软件控制”
    Java Selenium Actions模拟鼠标拖动dragAndDrop总结
  • 原文地址:https://www.cnblogs.com/flyinghome/p/14002276.html
Copyright © 2011-2022 走看看