XML解析--使用dom4j(常用)


一、使用dom4j解析XML介绍

Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来后独立开发的。与JDOM不同的是,dom4j使用接口和抽象父类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。

Dom4j是一个非常优秀的Java XML API。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也使用了Dom4j。

使用Dom4j开发,需引入Dom4j相应的jar文件。

优点:性能优异,功能强大,极易使用。
缺点:暂不了解,但越来越多的Java软件都在使用dom4j来读写XML。

二、dom4j解析XML的步骤

使用Sax解析XML的准备工作:

1.引入dom4j的三个jar包后,添加环境依赖
在这里插入图片描述

2.封装XML文件成一个对象

(1)直接创建SaxReader解析器对象

	SAXReader reader = new SAXReader();

(2)获得Document文档对象

	Document doc = reader.read(new File("src/com/empList.xml"));

三、dom4j解析XML实例

(1)给出需要解析的XML的文件

<?xml version="1.0" encoding="UTF-8"?>
<list>
	<emp id="1">
		<name>张三</name>
		<age>34</age>
		<gender></gender>
		<salary>3000</salary>
	</emp>
	<emp id="2">
		<name>王五</name>
		<age>18</age>
		<gender></gender>
		<salary>6500</salary>
	</emp>
	<emp id="3">
		<name>赵六</name>
		<age>28</age>
		<gender></gender>
		<salary>4400</salary>
	</emp>
	<emp id="4">
		<name>钱七</name>
		<age>19</age>
		<gender></gender>
		<salary>12000</salary>
	</emp>
</list>

(2)将XML文件封装成Java对象

package com.entity;
/**
 * 类说明:
 * 		将emlListXML封装成Emp对象
 * @author qianliangguo
 */
public class Emp {
	private int id;
	private String name;
	private int age;
	private String gender;
	private double salary;
	public Emp() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Emp(int id, String name, int age, String gender, double salary) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.salary = salary;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "Emp [id=" + id + ", name=" + name + ", age=" + age
				+ ", gender=" + gender + ", salary=" + salary + "]";
	}
}

(3)使用dom4j对XML进行解析

查询XML文件中的节点

package com.test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.entity.Emp;

/**
 * 类说明:
 * 		使用dom4j解析XML
 * 使用dom4j解析XML的准备工作:
 * 		1.引入dom4j的三个jar包后,添加环境依赖.
 * 		2.将XML封装成一个Java对象
 * 使用dom4j的步骤:
 * 		1.直接创建SaxReader解析器对象
 * 		2.获得Document文档对象
 * 
 * @author qianliangguo
 */
public class Dom4jXML {
	public static void main(String[] args) throws Exception {
		//1.创建SaxReader解析器
		SAXReader reader = new SAXReader();
		//2.获得Document文档对象
		Document doc = reader.read(new File("src/com/empList.xml"));
		
		/**
		 * 打印XML封装成对象后的所有属性和值
		 */
			//获得根节点
			Element root = doc.getRootElement();
			//获得根节点下所有子节点
			List<Element> elements = root.elements();
			//创建List<Emp>保存员工信息
			List<Emp> list = new ArrayList<Emp>();
			//遍历子节点
			for (Element element : elements) {
				//先获得节点的属性再获得节点的值
//				String id = element.attribute("id").getValue();
				//直接根据节点属性获得节点值
				String id = element.attributeValue("id");
				//先获得节点再获得节点值
				String name = element.element("name").getText();
				//直接根据节点名获得节点值
				String age = element.elementText("age");
				String gender = element.elementText("gender");
				String salary = element.elementText("salary");
				Emp emp = new Emp(Integer.parseInt(id),name,Integer.parseInt(age),gender,Double.parseDouble(salary));
				list.add(emp);
			}
			System.out.println(list);
	}
}

解析效果:
在这里插入图片描述

向XML文件中添加节点

创建文档,添加元素和节点(这里规定元素的下一级是节点)
为元素添加属性:addAttribute(,)
添加子节点:addElement()
添加文本值:addText()
添加子节点,并设置文本addElement().addText()

	/**
	 * 测试说明:
	 * 		向XML文件添加节点
	 * 
	 * 用到的一些API:
	 * 		为元素添加属性:addAttribute(,)
	 * 		添加子节点:addElement()
	 * 		添加文本值:addText()
	 * 		添加子节点,并设置文本addElement().addText()
	 * (这里规定元素的下一级是节点)
	 */
	@Test
	public void testAdd() throws Exception{
		//list存放Emp对象
		List<Emp> emps = new ArrayList<Emp>();
		emps.add(new Emp(1,"Hudie",21,"男",9000.0));
		emps.add(new Emp(2,"Huahua",20,"女",8000.0));
		emps.add(new Emp(2,"冬雨",18,"女",10000.0));
		//创建文档对象
		Document doc = DocumentHelper.createDocument();
		//创建根节点
		Element root = doc.addElement("list");
		for (Emp emp : emps) {
			//向根节点中添加名为emp的子元素
			Element ele = root.addElement("emp");
			//为emp元素添加id属性
			ele.addAttribute("id", String.valueOf(emp.getId()));
			//添加子节点,并设置节点中的文本值
			ele.addElement("name").addText(emp.getName());
			ele.addElement("age").addText(String.valueOf(emp.getAge()));
			ele.addElement("gender").addText(emp.getGender());
			ele.addElement("salary").addText(String.valueOf(emp.getSalary()));
		}
		//创建输出流,指明输出路径
		FileOutputStream fos = new FileOutputStream("src/com/EmpList2.xml");
		XMLWriter writer = new XMLWriter();
		writer.setOutputStream(fos);
		//将文档写出到指定路径中
		writer.write(doc);
		writer.close();
	}

该测试成功生成了一个XML文件
在这里插入图片描述

修改XML文件的节点

	/**
	 * 测试说明:
	 * 		删除XML文件中的元素
	 * @throws Exception
	 */
	@Test
	public void testRemo() throws Exception{
		SAXReader saxReader = new SAXReader();
		Document doc = saxReader.read("src/com/EmpList2.xml");
		//获得根节点
		Element root = doc.getRootElement();
		//获取下标为0的节点
		Element element = (Element)root.elements().get(0);
			System.out.println(element.attribute("id"));
		//删除该节点的id属性
		element.remove(element.attribute("id"));
			System.out.println(element.attribute("id"));
			
		//获得名为name节点
		Element name = element.element("name");
			System.out.println(name.getText());
		//删除该节点
		element.remove(name);
			System.out.println(element.elementText("name"));
	}

解析效果:
在这里插入图片描述

删除XML文档中的属性和节点

	/**
	 * 测试说明:
	 * 		修改XML文档中的节点和属性
	 * @throws Exception
	 */
	@Test
	public void testUpdate() throws Exception{
		//1.直接创建SaxReader解析器对象
		SAXReader sax = new SAXReader();
		//2.获得Document对象
		Document doc = sax.read("src/com/EmpList2.xml");
		
		//获取根节点
		Element root = doc.getRootElement();
		//获得第一个节点
		Element element = (Element)root.elements().get(0);
		Attribute id = element.attribute("id");
			System.out.println("第一个节点的id是:"+id.getValue());
		//修改属性值
		id.setValue("19");
			System.out.println("第一个节点修改后的id是:"+id.getValue());
		//获得name节点
		Element name = element.element("name");
			System.out.println("name的值是"+name.getText());
		//修改name的文本值
		name.setText("Huahudiediedie");
			System.out.println("修改后name的值是"+name.getText());
	}

解析效果:
在这里插入图片描述

发布了332 篇原创文章 · 获赞 871 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/103988308
今日推荐