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

本文介绍使用dom4j库进行XML文件的创建、增删改查等基本操作,并提供具体实例代码。

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

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;

	}
}

查找结果:

小红性别: 男



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值