- 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();
}
备注:传智播客视频学习笔记