【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

posted @ 2020-11-18 21:31  夏夜凉凉  阅读(1267)  评论(0编辑  收藏  举报