Javaweb-xml编程-Dom4j解析xml文档

本文介绍Dom4j库的基本使用方法,包括读取、添加、删除和更新XML文档中的元素,并提供了解决乱码问题的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Dom4j是一个简单、灵活的开放源代码的库。
  • 与JDOM不同的是,dom4j使用接口和抽象基类,虽然dom4j的API相对复杂一些,但它提供了比JDOM更好的灵活性。
  • dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。
  • 使用dom4j开发,需要下载dom4j相应的jar文件。

步骤一:导入jar包:

①项目中new folder,命名为lib
②复制下载好的dom4j的jar包,粘贴到lib文件夹中
③在导入的jar包鼠标右键build path,如下图所示:
这里写图片描述);

步骤二:编写代码

package dom4j;

import java.io.File;
import java.io.FileWriter;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

public class Demo1 {
    //读取xml文档中的第二本书的书名
    @Test
    public void read() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));
        //先得到根节点
        Element root = document.getRootElement();
        //根节点下面的书
        Element book = (Element) root.elements("书").get(1);//root.elemenmts得到所有书
        String value = book.element("书名").getText();
        System.out.println(value);
    }
    //得到第二本书的属性
    @Test
    public void readAttr() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));
        //先得到根节点
        Element root = document.getRootElement();
        //得到根节点下面的书
        Element book = (Element) root.elements("书").get(1);//root.elemenmts得到所有书
        String value = book.element("书名").attributeValue("name");
        System.out.println(value);
    }
    @Test
    //在第一本书上添加一个新的售价
    public void add() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));
        //先得到根节点
        //Element root = document.getRootElement();
        //得到根节点下面的书
        //Element book = (Element) root.elements("书").get(1);//root.elemenmts得到所有书
        Element book = document.getRootElement().element("书");
        book.addElement("售价").setText("200元");
       //更新内存
        XMLWriter writer = new XMLWriter(new FileWriter("src/book.xml"));
        writer.write(document);
        writer.close();
    }
    //出现乱码情况:字符编码问题
}

  • 说明:单元测试通过,但是xml文档出现乱码
    这里写图片描述

步骤三:解决dom4j保存数据时的乱码问题

FileWriter类从OutputStreamReader类继承而来。该类按字符向流中写入数据。写入数据时查的是(国标)GB2312编码表。而我们的xml文档的编码表是UTF-8,所以出现乱码情况。
方法一:

public void add() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));
        //先得到根节点
        //Element root = document.getRootElement();
        //得到根节点下面的书
        //Element book = (Element) root.elements("书").get(1);//root.elemenmts得到所有书
        Element book = document.getRootElement().element("书");
        book.addElement("售价").setText("200元");
       //更新内存
       XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"),"UTF-8"));
       //将new FileWriter更改为可以更改编码格式的方法

        writer.write(document);
        writer.close();
    }

方法二:

public void add() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));
        //先得到根节点
        //Element root = document.getRootElement();
        //得到根节点下面的书
        //Element book = (Element) root.elements("书").get(1);//root.elemenmts得到所有书
        Element book = document.getRootElement().element("书");
        book.addElement("售价").setText("200元");
       //更新内存
       //XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"),"UTF-8"));
       //将new FileWriter更改为可以更改编码方式的方法

        OutputFormat format = OutputFormat.createPrettyPrint();
        //漂亮的格式化输出器
        format.setEncoding("UTF-8");
        //给输出器指定编码表,xml文档是什么编码,格式化输出器就是什么编码

        XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);
       //使用字节流时写数据会自动查询格式化输出器指定的编码表,而字符流则会默认gb2312编码,不会去查格式化输出器
        writer.write(document);
        writer.close();
    }

步骤四:增删改查

增:

@Test
    //在第一本书的指定位置添加一个新的售价
    public void add2() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));
        //在指定位置添加需要得到书的所有孩子
        Element book = document.getRootElement().element("书");
        //list集合保存所有孩子
        List list =  book.elements();//书名,作者,售价;在作者后面再添加一个售价标签
        Element price = DocumentHelper.createElement("售价");
        price.setText("300元");
        //在第三个位置添加售价
        list.add(2, price);
        //添加之后要输出,输出书写如add()
        OutputFormat format = OutputFormat.createPrettyPrint();
        //漂亮的格式化输出器
        format.setEncoding("UTF-8");
        //给输出器指定编码表,xml文档是什么编码,格式化输出器就是什么编码
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);
        writer.write(document);
        writer.close();
    }    

删:

@Test
    //删除上面添加的售价节点
    public void delete() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));

        Element price = document.getRootElement().element("书").element("售价");
        price.getParent().remove(price);

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");

        XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);
        writer.write(document);
        writer.close();
    }   

改:

@Test
    //修改第二本书的作者名
    public void update() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));

        Element book = (Element) document.getRootElement().elements("书").get(1);//得到第二本书
        book.element("作者").setText("周志华");

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");

        XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);
        writer.write(document);
        writer.close();
    }    

备注:传智播客视频学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值