最新消息:关注【太平洋学习网】微信公众号,可以获取全套资料,【全套Java基础27天】【JavaEE就业视频4个月】【Android就业视频4个月】

dom4j解析xml案例(dom4j-1.6.1.jar)_对xml增删改查

Javaweb 太平洋学习网 浏览 评论

dom4j解析xml文件非常方便,本案例使用dom4j对xml进行增删改查操作,请认真看教程,首先引入dom4j-1.6.1.jar包,jar包下载地址:https://dom4j.github.io

一:首先在lib中引入dom4j-1.6.1.jar包,在src目录下创建student.xml文件,直接复制即可用,代码如下。

<?xml version="1.0" encoding="UTF-8"?>
<xml-body> 
  <student id="A100"> 
    <name>小红</name>
    <age>18</age>  
    <gender>女</gender>  
    <address>广州天河骏景花园</address> 
  </student>  
  <student id="A101"> 
    <name>小明</name>  
    <age>17</age>  
    <gender>男</gender>  
    <address>广州天河华景新城</address> 
  </student> 
</xml-body>

二:创建Student实体类,用于封装student.xml内容,实体类如下。

// 实体类,封装数据
public class Student {

	private String id;
	private String name;
	private char gender;
	private String age;
	private String address;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age= age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public char getGender() {
		return gender;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "Student [address=" + address + ", gender=" + gender + ", id="
				+ id + ", name=" + name + "]";
	}
	
}

三:在IStudentDao.java内定义增删改查的接口。

import java.util.List;

// 接口, 定义规范
public interface IStudentDao {

	/**
	 *  保存一个student
	 * @param student 传入封装的student对象
	 */
	void save(Student student);
	/**
	 *  根据编号删除
	 * @param id
	 */
	void delete(String id);
	/**
	 * 修改(根据id修改)
	 * @param student
	 */
	void update(Student student);
	/**
	 *  根据编号查询
	 * @param id
	 * @return 
	 */
	Student findById(String id);
	/**
	 *  查询全部学员
	 * @return
	 */
	List<Student> findAll();
}

四:创建StudentDaoImpl接口实现类,实现IStudentDao中定义的增删改查接口方法。

import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;

// 实现
public class StudentDaoImpl implements IStudentDao {

	// jdk1.5 只支持对类方法的Override,不支持接口!
	// jdk1.6以及以后的版本都支持对接口的Override
	// 如果@Override报错, 选中项目,右键,属性,找到java compiler 修改编译环境
	@Override
	public Student findById(String id) {
		// 创建一个Dom4J解析器,加载xml,获取文档对象
		Document doc = XmlUtils.getDocument();
		// 获取根节点
		Element root = doc.getRootElement();
		
		try {
			// 获取根节点下,所有子节点
			List<Element> list = root.elements();
			for (Element e : list) {
				// e 表示每一个student,
				// 获取student的id属性
				String idValue = e.attributeValue("id");
				// 判断
				if (id.equals(idValue)) {
					// 找到指定id的student
					Student student = new Student();
					student.setId(id);
					student.setName(e.element("name").getTextTrim());
					student.setGender(e.elementText("gender").charAt(0));
					student.setAddress(e.elementText("address"));
					return student;
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
		return null;
	}

	@Override
	public void delete(String id) {
		try {
			Document doc = XmlUtils.getDocument();
			Element root = doc.getRootElement();
			List<Element> list = root.elements();
			for (Element e : list) {
				if (id.equals(e.attributeValue("id"))) {
					// 找到了要删除的元素
					// 通过父亲删除
					// e.getParent().remove(e);

					// 自己删除自己
					e.detach();
					break;
				}
			}
			// 更新
			XmlUtils.write2XML(doc);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	@Override
	public List<Student> findAll() {
		try {
			Document doc = XmlUtils.getDocument();
			// 获取根节点
			Element root = doc.getRootElement();
			// list集合
			List<Student> listStudent = new ArrayList<Student>();

			List<Element> list = root.elements();
			for (Element e : list) {
				// 获取每一个student节点, 再取其中数据
				Student student = new Student();
				student.setId(e.attributeValue("id"));
				student.setName(e.element("name").getTextTrim());
				student.setGender(e.elementText("gender").charAt(0));
				student.setAddress(e.elementText("address"));
				// 封装好的对象,添加到listStudent
				listStudent.add(student);
			}
			return listStudent;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	@Override
	public void save(Student student) {
		try {
			Document doc = XmlUtils.getDocument();

			// 1. 获取跟节点
			Element root = doc.getRootElement();

			// 2. 给跟节点添加子节点-student
			Element ele_student = root.addElement("student");
			// 2. 给跟节点student 添加id属性
			ele_student.addAttribute("id", student.getId());

			// 3. student节点,添加name子节点
			ele_student.addElement("name").setText(student.getName());
			// 3. student节点,添加age子节点
			ele_student.addElement("age").setText("20");
			// 3. student节点,添加gender子节点
			ele_student.addElement("gender").setText(student.getGender() + "");
			// 3. student节点,添加address子节点
			ele_student.addElement("address").setText(student.getAddress());

			// 4. 更新
			XmlUtils.write2XML(doc);

		} catch (Exception e) {
			throw new RuntimeException(e);
		}

	}

	@Override
	public void update(Student student) {
		// 先根据id找到更新的student标签,再更新值
		try {
			Document doc = XmlUtils.getDocument();
			Element root = doc.getRootElement();
			List<Element> list = root.elements();
			for (Element e : list) {
				if (student.getId().equals(e.attributeValue("id"))) {
					// 找到更新的元素

					// 获取更新的name标签,再设置值
					e.element("name").setText(student.getName());
					// 获取更新的age标签,再设置值
					// e.element("age").setText("20");
					// 获取更新的gender标签,再设置值
					e.element("gender").setText(student.getGender() + "");
					// 获取更新的address标签,再设置值
					e.element("address").setText(student.getAddress());
					break;
				}
			}
			// 更新
			XmlUtils.write2XML(doc);

		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

}

五:由于第四步中每个方法都使用到了Document对象和,所以我把公共的方法抽取到了XmlUtils里面,代码如下:

public class XmlUtils {
	
	private static String path = "src/student.xml";

	/**
	 * 返回Document对象
	 */
	public static Document getDocument(){
		try {
			SAXReader reader = new SAXReader();
			Document doc = reader.read(path);
			return doc;
		} catch (DocumentException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 更新doc到默认的xml文件
	 * @param doc
	 */
	public static void write2XML(Document doc){
		try {
			OutputFormat format = OutputFormat.createPrettyPrint();
			XMLWriter writer = new XMLWriter(new FileOutputStream(new File(path)), format);
			writer.write(doc);
			writer.close();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
}

六:测试dom4j方法,本人创建了App.java类,使用junit @Test方法来测试dom4j增删改查方法

import org.dom4j.DocumentException;
import org.junit.Test;

// 测试类
public class App {
	
	IStudentDao studentDao = new StudentDaoImpl();

	// 测试 (用户,调用者  )
	@Test
	public void findById() {
		try {
			Student stu = studentDao.findById("A100");
			System.out.println(stu);
		} catch (Exception e) {
			System.out.println("当前网络忙,请稍后再试!");
			e.printStackTrace();  // 开发时候查看异常
		}
	}
	@Test
	public void delete() {
		try {
			studentDao.delete("A100");
		} catch (Exception e) {
			System.out.println("当前网络忙,请稍后再试!");
			e.printStackTrace();  // 开发时候查看异常
		}
	}
	@Test
	public void save() {
		try {
			Student s = new Student();
			s.setId("B10000");
			s.setName("Test");
			s.setGender('男');
			s.setAddress("广州");
			studentDao.save(s);
		} catch (Exception e) {
			e.printStackTrace();  
		}
	}
	@Test
	public void findAll() {
		try {
			System.out.println(studentDao.findAll());
		} catch (Exception e) {
			e.printStackTrace();  
		}
	}
	
	@Test
	public void update() {
		try {
			Student s = new Student();
			s.setId("B10000");
			s.setName("Rose");
			s.setGender('女');
			s.setAddress("广州天河");
			studentDao.save(s);
		} catch (Exception e) {
			e.printStackTrace();  
		}
	}
}


来源网站:太平洋学习网,转载请注明出处:http://www.tpyyes.com/a/javaweb/2017/0704/129.html

    与本文相关的文章

    发表我的评论
    取消评论

    表情

    您的回复是我们的动力!

    • 昵称 (必填)

    网友最新评论