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;
}
}
查找结果:
小红性别: 男