[color=red]这是给自己看的,但是不能设为私有。。。[/color]
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>