XML parsing - use dom4j (common)


First, the use dom4j parse XML description

Dom4j is a simple, flexible open source library. Dom4j is separated out by the early development of JDOM people developed independently. The difference is that with JDOM, dom4j use interfaces and abstract superclass, although Dom4j the API is relatively complex, but it offers greater flexibility than JDOM.

Dom4j Shi 一个非常优秀的Java XML API. Dom4j now a lot of software used, such as Hibernate, including the sun's own JAXM also used Dom4j.

Use Dom4j development, need to be introduced Dom4j corresponding jar file.

Advantages: Performance, powerful and easy to use.
Disadvantages: temporarily understand, but more and more Java software are in use dom4j to read and write XML.

Two, dom4j of XML parsing step

Use Sax parsing XML preparations:

1. After the introduction of three jar dom4j package 添加环境依赖.
Here Insert Picture Description

2. 封装XML文件as an object

(1) parser object directly create SaxReader

	SAXReader reader = new SAXReader();

(2) obtaining Document Document Object

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

Three, dom4j parsing XML instance

(1) given the need to parse XML documents

<?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) the XML file packaged as Java objects

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) the use of XML parsing dom4j

Queries node in the XML file

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);
	}
}

Analytical results:
Here Insert Picture Description

Add nodes to an XML file

Create a document, add elements and nodes (defined here is the next level node elements)
add attributes to elements: addAttribute (,)
to add child nodes: addElement ()
to add text value: addText ()
to add child nodes, and set the text 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();
	}

The test successfully generate an XML file
Here Insert Picture Description

Modify node XML file

	/**
	 * 测试说明:
	 * 		删除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"));
	}

Analytical results:
Here Insert Picture Description

Delete XML document nodes and attributes

	/**
	 * 测试说明:
	 * 		修改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());
	}

Analytical results:
Here Insert Picture Description

Published 332 original articles · won praise 871 · views 130 000 +

Guess you like

Origin blog.csdn.net/weixin_43691058/article/details/103988308