版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38225558/article/details/82747676
注意:需要导入 dom4j.jar 包
下面是我的Persons.xml文件数据
<?xml version="1.0" encoding="utf-8"?>
<persons>
<person id="0">
<name>翠花</name>
<age>18</age>
<sex>女</sex>
</person>
<person id="1">
<name>老王</name>
<age>20</age>
<sex>男</sex>
</person>
</persons>
增删改查:
/**
* DOM4J解析XML
* XML文件数据的增删改查
* @author 郑清
*/
public class Dom4jDemo {
static File url = new File("E:/eclipse-workspace/JavaEE_workspace/Day34XML/src/Persons.xml");// Persons.xml文件绝对路径
public static void main(String[] args) throws Exception {
dom4jGetElement();// dom4j原生方式解析xml
dom4jXPathGetElement();// dom4j Xpath方式解析xml
dom4jUpdateElement();//修改数据
dom4jAddElement();//添加数据
dom4jDeleteElement();//删除数据
}
public static void dom4jGetElement() throws Exception {
// 获取一个Document对象
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(url);
// 通过文档对象doc获取文档中的根节点
Element root = doc.getRootElement();
// 获取节点person
List<Element> personList = root.elements();// 获取多个标签(即根节点下的子节点),返回集合对象
// 获取第1个节点
Element person = personList.get(0);
// 获取第1个节点下的name元素
Element element = person.element("name");
// 获取name中的文本
System.out.println(element.getText());
System.out.println(person.elementText("name"));
// 注意:只能获取一次节点值 第二次获取的值还是第一次的!!
/* Element person2 = personList.get(1);
Element element2 =person.element("name");
System.out.println(element2.getText());*/
}
public static void dom4jXPathGetElement() throws Exception {
// 获取一个Document对象
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(url);
// 获取id为1的节点下的name元素
Node name = doc.selectSingleNode("/persons/person[@id = '1']/name[1]");
System.out.println(name.getText());
}
public static void dom4jUpdateElement() throws Exception {
// 获取一个Document对象
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(url);
// 获取id为1的节点下的name元素
Node name = doc.selectSingleNode("/persons/person[@id = '1']/name[1]");
name.setText("这里是修改的id为1的节点下的name元素值");
// 注意:XML文件是被加载到内存中 修改也是在内存中 ==》因此需要将内存中的数据同步到磁盘中
XMLWriter writer = new XMLWriter(new FileWriter(url));//将内存数据关联给一个字符输出流
writer.write(doc);
writer.close();
}
public static void dom4jAddElement() throws Exception {
// 获取一个Document对象
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(url);
//获取根节点
Element root = doc.getRootElement();
//添加一个标签 即一个节点
Element person = root.addElement("person");
//添加值到节点中
person.addElement("name").setText("小星");
person.addElement("age").setText("16");
person.addElement("sex").setText("女");
// 注意:XML文件是被加载到内存中 修改也是在内存中 ==》因此需要将内存中的数据同步到磁盘中
//XMLWriter writer = new XMLWriter(new FileWriter(url));
// 按照指定格式将dom打印到xml文件中
//方式一:
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileWriter(url), format);//构造一个具有良好输出格式的XML输出对象
writer.write(doc);
writer.close();
//方式二:
// OutputFormat format = OutputFormat.createCompactFormat();
// writer = new XMLWriter(new FileWriter(url), format);
// writer.write( doc );
// writer.close();
}
public static void dom4jDeleteElement() throws Exception {
// 获取一个Document对象
SAXReader reader = new SAXReader();
Document doc = reader.read(url);
// 通过文档对象doc获取文档中的根节点
Element root = doc.getRootElement();
//获取第2个节点
Node person = root.selectSingleNode("/persons/person[2]");
//移出节点
root.remove(person);
// 注意:XML文件是被加载到内存中 修改也是在内存中 ==》因此需要将内存中的数据同步到磁盘中
XMLWriter writer = new XMLWriter(new FileWriter(url));
// 按照指定格式将dom打印到xml文件中
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter(new FileWriter(url), format );
writer.write( doc );
writer.close();
}
}