`
qingzuochen
  • 浏览: 271665 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dom4j xml读写修改等操作

阅读更多
这是给自己看的,但是不能设为私有。。。


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;


public class PersonDAO {
	private static final Logger logger = Logger.getLogger(PersonDAO.class);
	
	private Document doc;
	
	private String xmlPath = Thread.currentThread().getContextClassLoader().getResource("persons.xml").getPath();
	private static final String error = "error";
	private static final String success = "success";
	
	private static PersonDAO personDAO = new PersonDAO();
	
	private PersonDAO(){
		getPersonData();
	}
	
	public PersonDAO getInstance(){
		return personDAO;
	}
	
	/**
	 * 获取人员配置数据
	 * @return
	 */
	private Document getPersonData(){
		if(doc == null){
			//如果doc为空,读取文件
			File inputXml = new File(xmlPath);
			SAXReader saxReader = new SAXReader();
			try {
				doc = saxReader.read(inputXml);
			} catch (DocumentException e) {
				logger.error("读取人员配置文件错误!", e);
			}
		}
		return doc;
	}
	/**
	 * 更新人员配置
	 * @return
	 */
	private synchronized String writePersonData(){
		//TODO 希望加上备份恢复机制
		try {
			FileOutputStream outputStream = new FileOutputStream(xmlPath);
			OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");
			XMLWriter xmlWriter = new XMLWriter(outputStream,format);
			xmlWriter.write(getPersonData());
			xmlWriter.close();
		} catch (IOException e) {
			logger.error("更新人员配置文件错误!",e);
			return error;
		}
		return success;
	}
	/**
	 * 判断用户名是否存在
	 * @param name 人员名称
	 * @return
	 */
	public boolean IsNameExist(String name){
		//获取所有人员的名称
		List<Node> nodes = doc.selectNodes("persons/person/name");
		//检查新增人员的名称是否存在
		Set<String> set = new HashSet<String>();
		for (int i = 0; i < nodes.size(); i++) {
			set.add(nodes.get(i).getText());
		}
		if(set.contains(name)){
			return true;
		}
		return false;
	}
	
	
	/**
	 * 增加人员
	 * @param personVO 人员信息
	 * @return
	 */
	public synchronized String addPerson(PersonVO personVO){
		//名字不能为空
		if(personVO.getName() == null){
			logger.error("person's name is null");
			return "name.isnull";
		}
		
		try {
			if(IsNameExist(personVO.getName())){
				logger.error("name exist");
				return "name.exist";
			}
			
			//创建person节点
			Element person = DocumentHelper.createElement("person");
			//以下是增加属性节点 name、email、phone等
			if(personVO.getName() != null){
				Element name = DocumentHelper.createElement("name");
				name.setText(personVO.getName());
				person.add(name);
			}
			if(personVO.getPhone() != null){
				Element phone = DocumentHelper.createElement("phone");
				phone.setText(personVO.getPhone());
				person.add(phone);
			}
			if(personVO.getEmail() != null){
				Element email = DocumentHelper.createElement("email");
				email.setText(personVO.getEmail());
				person.add(email);
			}
			if(personVO.getComment() != null){
				Element comment = DocumentHelper.createElement("comment");
				comment.setText(personVO.getComment());
				person.add(comment);
			}
			doc.getRootElement().add(person);
			logger.info("增加后的xml内容:" + doc.asXML());
			//更新到文件
			String result = writePersonData();
			return result;
		} catch (RuntimeException e) {
			logger.error("增加人员时发生异常", e);
			return "addperson.error";
		}
	}
	/**
	 * 修改人员信息,修改除名称以外的其他信息
	 * @param personVO 人员信息
	 * @return
	 */
	public synchronized String updatePerson(PersonVO personVO){
		//名字不能为空
		if(personVO.getName() == null){
			logger.error("person's name is null");
			return "name.isnull";
		}
		List<Element> list = doc.selectNodes("persons/person/name");
		Element nameElement = null;
		//找到要修改的人员的name节点
		for (int i = 0; i < list.size(); i++) {
			if(list.get(i).getText().equals(personVO.getName())){
				nameElement = list.get(i);
				break;
			}
		}
		//如果没找到,表示该人员不存在
		if(nameElement == null){
			return "person.notexist";
		}
		//获取父节点 即 person节点
		Element parent = nameElement.getParent();
		//如果节点存在,修改属性;如果节点不存在,增加节点
		Element phone = parent.element("phone");
		if(phone == null){
			phone = DocumentHelper.createElement("phone");
			phone.setText(personVO.getPhone());
			parent.add(phone);
		}else {
			phone.setText(personVO.getPhone());
		}
		
		Element email = parent.element("email");
		if(email == null){
			email = DocumentHelper.createElement("email");
			email.setText(personVO.getEmail());
			parent.add(email);
		}else {
			email.setText(personVO.getEmail());
		}
		
		Element comment = parent.element("comment");
		if(comment == null){
			comment = DocumentHelper.createElement("comment");
			comment.setText(personVO.getComment());
			parent.add(comment);
		}else {
			comment.setText(personVO.getComment());
		}
		logger.info("修改后的文档:	\r\n" + doc.asXML());
		String result = writePersonData();
		return result;
	}
	
	/**
	 * 列举所有人员信息
	 * @return
	 */
	public List listPersons(){
		List<PersonVO> list =  new ArrayList<PersonVO>();
		Element root = doc.getRootElement();
		Iterator<Element> it = root.elementIterator();
		while(it.hasNext()){
			Element element = it.next();
			String name = element.selectSingleNode("name").getText();
			String phone = element.selectSingleNode("phone").getText();
			String email = element.selectSingleNode("email").getText();
			String comment = element.selectSingleNode("comment").getText();
			
			PersonVO personVO = new PersonVO();
			personVO.setComment(comment);
			personVO.setEmail(email);
			personVO.setName(name);
			personVO.setPhone(phone);
			list.add(personVO);
			logger.info("personVO info :"+personVO);
		}
		return list; 
	}
	/**
	 * 删除人员
	 * @param name 人员姓名
	 * @return
	 */
	public String deletePerson(String name){
		//名字不能为空
		if(name == null){
			logger.error("person's name is null");
			return "name.isnull";
		}
		List<Element> list = doc.selectNodes("persons/person/name");
		Element nameElement = null;
		//找到要修改的人员的name节点
		for (int i = 0; i < list.size(); i++) {
			if(list.get(i).getText().equals(name)){
				nameElement = list.get(i);
				break;
			}
		}
		//如果没找到,表示该人员不存在
		if(nameElement == null){
			return "person.notexist";
		}
		//获取父节点 即 person节点
		Element parent = nameElement.getParent();
		boolean flag = doc.getRootElement().remove(parent);//remove只能删除直属的节点
		logger.info("删除结果:"+ flag);
		logger.info("删除后的文档:\r\n"+ doc.asXML());
		if(!flag){
			return "delete.failure";
		}
		String result = writePersonData();
		return result;
	}
	
	public static void main(String[] args) {
		PersonDAO personDAO = new PersonDAO();
		PersonVO personVO = new PersonVO();
		personVO.setName("张三4");
		personVO.setPhone("1584");
		personVO.setEmail("123email");
		personVO.setComment("123comment");
		System.out.println(personDAO.deletePerson("张三4"));;
	}
}



<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person>
		<name>张三</name>
		<phone>123123123</phone>
		<email>123123123@qq.com</email>
		<comment>老大</comment>
	</person>
	
	<person>
		<name>李四</name>
		<phone>123123</phone>
		<email>123123123@qq.com</email>
		<comment>老二</comment>
	</person>
	
	<person>
		<name>abc</name>
		<phone>123123123</phone>
		<email>123123123@qq.com</email>
		<comment>老二</comment>
	</person>
</persons>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics