java中用dom4j对xml文件进行操作

时间:2022-03-23 21:34:19

dom4j的增删改查(简单例子)

1.dom4j的jar包:

在用dom4j之前需要先导入dom4j的jar包,我用的是dom4j-1.6.1这个版本的。

2.首先利用dom4j创建一个xml文件:

package lili;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class Dome1 {

public static void main(String[] args) throws Exception {
String fileName = "Person.xml";
createNewXml(fileName);

}


public static void createNewXml(String fileName) {
// 创建文档对象
Document document = DocumentHelper.createDocument();
// 添加一个根结点
<span style="white-space:pre"></span>Element root = document.addElement("root");
<span style="white-space:pre"></span>//在根结点下加入新的person结点
<span style="white-space:pre"></span>Element Person = root.addElement("Person");
// 添加属性及属性值
Person.addAttribute("id", "7");
// 在根结点下加入一个name的结点
Element name = Person.addElement("name");
// 设置结点的内容
name.setText("小明");

Element sex = Person.addElement("sex");
sex.setText("女");

Element age = Person.addElement("age");
age.setText("3");

try {
// 对xml的读入都需要进行该操作,将缓存的数据写入到文件中
File file = new File(fileName);
FileOutputStream fos = new FileOutputStream(file);

// 创建美化文档的format对象,如果没有这个对象,生成的XML文档的元素不会换行,不太美观
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(fos, format);
xmlWriter.write(document);
xmlWriter.close();
} catch (IOException e) {
e.printStackTrace();
}

}
}

创建的Person.xml

<?xml version="1.0" encoding="UTF-8"?>


<root>
  <Person id="7">
    <name>小明</name>
    <sex>女</sex>
    <age>3</age>
  </Person>
</root>

3.增加数据:

public static void addNewElement(String fileName) throws DocumentException {
// 获取解析器
SAXReader reader = new SAXReader();
File file = new File(fileName);
// 获取文件对象
Document dom = reader.read(file);
// 获取根结点
Element root = dom.getRootElement();

// 添加新元素
Element person = root.addElement("Person");
// 给新元素添加属性及属性值
person.addAttribute("id", "8");

// 在新元素下加入一个标签(结点)
Element name = person.addElement("name");
name.setText("小红");

Element sex = person.addElement("sex");
sex.setText("男");

Element age = person.addElement("age");
age.setText("3");

try {
// 对xml的读入都需要进行该操作,将缓存的数据写入到文件中
FileOutputStream fos = new FileOutputStream(file);

// 创建美化文档的format对象,如果没有这个对象,生成的XML文档的元素不会换行,不太美观
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(fos, format);
xmlWriter.write(dom);
xmlWriter.close();
} catch (IOException e) {
e.printStackTrace();
}

}


添加后结果:


<?xml version="1.0" encoding="UTF-8"?>

<root>
<Person id="7">
<name>小明</name>
<sex>女</sex>
<age>3</age>
</Person>
<Person id="8">
<name>小红</name>
<sex>男</sex>
<age>3</age>
</Person>
</root>

4.删除数据:

在上图的基础上删除数据
public static void deleteElement(String fileName) throws DocumentException {
SAXReader reader = new SAXReader();
File file = new File(fileName);
// 获取文件对象
Document dom = reader.read(file);
// 获取根结点
Element root = dom.getRootElement();

// 以删除person为小红的年龄为例

// 由于有多个Person结点,所以用个列表保存所有结点为Person的结点
List<Element> list = root.elements("Person");
// List<Element> list = root.elements(); 则是获取所有结点,不只是Person的结点

Element Person = null;
for (int i = 0; i < list.size(); i++) {
Person = list.get(i);

if (Person.attributeValue("id").equals("8")) {
// 移除一个结点需要用它的父结点调用remove方法
Element age = Person.element("age");
Person.remove(age);
}
}

try {
// 对xml的读入都需要进行该操作,将缓存的数据写入到文件中
FileOutputStream fos = new FileOutputStream(file);

// 创建美化文档的format对象,如果没有这个对象,生成的XML文档的元素不会换行,不太美观
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(fos, format);
xmlWriter.write(dom);
xmlWriter.close();
} catch (IOException e) {
e.printStackTrace();
}

}



删除后结果:

<?xml version="1.0" encoding="UTF-8"?>

<root>
<Person id="7">
<name>小明</name>
<sex>女</sex>
<age>3</age>
</Person>
<Person id="8">
<name>小红</name>
<sex>男</sex>
</Person>
</root>

5.修改数据:

在上面的基础上修改person为小明的年龄为例:

public static void ChangeElement(String fileName) throws DocumentException {
SAXReader reader = new SAXReader();
File file = new File(fileName);
// 获取文件对象
Document dom = reader.read(file);
// 获取根结点
Element root = dom.getRootElement();

// 以修改person为小明的年龄为例

// 由于有多个Person结点,所以用个列表保存所有结点为Person的结点
List<Element> list = root.elements("Person");
// List<Element> list = root.elements(); 则是获取所有结点,不只是Person的结点

Element Person = null;
for (int i = 0; i < list.size(); i++) {
Person = list.get(i);
if (Person.attributeValue("id").equals("7")) {
Element age = Person.element("age");
age.setText("4");
}
}

try {
// 对xml的读入都需要进行该操作,将缓存的数据写入到文件中
FileOutputStream fos = new FileOutputStream(file);

// 创建美化文档的format对象,如果没有这个对象,生成的XML文档的元素不会换行,不太美观
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(fos, format);
xmlWriter.write(dom);
xmlWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}


修改后结果:

<?xml version="1.0" encoding="UTF-8"?>

<root>
<Person id="7">
<name>小明</name>
<sex>女</sex>
<age>4</age>
</Person>
<Person id="8">
<name>小红</name>
<sex>男</sex>
</Person>
</root>


6.查找数据:

以上面修改后的结果为例子 查找其中name为小红的性别:
public static void main(String[] args) throws Exception {
String fileName = "Person.xml";
createNewXml(fileName);
addNewElement(fileName);
deleteElement(fileName);
ChangeElement(fileName);

String sex = findSexByName(fileName, "小红");
System.out.println("小红性别: " + sex);
}

public static String findSexByName(String fileName, String nameString)
throws DocumentException {
String sex = "未找到";
SAXReader reader = new SAXReader();
File file = new File(fileName);
// 获取文件对象
Document dom = reader.read(file);
// 获取根结点
Element root = dom.getRootElement();

// 由于有多个Person结点,所以用个列表保存所有结点为Person的结点
List<Element> list = root.elements("Person");
// List<Element> list = root.elements(); 则是获取所有结点,不只是Person的结点

Element Person = null;
for (int i = 0; i < list.size(); i++) {
Person = list.get(i);

Element nameElement = Person.element("name");
String nameString2 = nameElement.getText();
if (nameString2.equals(nameString)) {
Element sexElement = Person.element("sex");
sex = sexElement.getText();
break;
}
}

return sex;

}
}

查找结果:

小红性别: 男