`
qingzuochen
  • 浏览: 276315 次
  • 性别: 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>

分享到:
评论

相关推荐

    dom4j读写xml文档实例

    在这个实例中,我们将深入理解DOM4J库如何帮助我们处理XML文档,并通过实际操作来熟悉其核心功能。 XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件、文档存储等领域。...

    dom4j_XML.rar_DOM4J_dom4j xml java_java xml_读写xml

    例子比较简单”的描述中,我们可以推断出这个压缩包包含了一些关于如何使用DOM4J进行XML读写的基本示例。以下是对这些关键知识点的详细解释: 1. **XML解析**:DOM4J支持两种解析XML文档的方式:SAX(Simple API ...

    使用dom4j对xml的读写

    **使用DOM4J对XML的读写** DOM4J是一个非常强大的Java库,专门用于处理XML文档。它提供了丰富的API,使得XML的读取、创建、修改和解析变得简单易行。相较于JDOM,DOM4J确实提供了更多的功能,虽然在学习曲线方面...

    dom4j关于xml读写的例子里面还有dom4j的jar包

    除了基本的读写操作,DOM4J还支持XPath查询,这是一种强大的定位XML元素的方式。通过`XPathExpression`和`XPathFactory`,你可以编写XPath表达式来查找XML文档中的特定节点。例如,`//elementName`可以匹配所有名为`...

    读写超大类xml文件,使用dom4j读写xml文件的工具类

    基于dom4j的读写xml文件的工具包。封装了dom4j操作xml文档的常和方法。 支持两种读写方法。1:针对小文件的读取整个文档,2:针对大文件的,逐行读取。读到几百M文件毫无压力。

    dom4j解析xml详解

    DOM4J的核心优势之一在于其丰富的接口体系,这些接口定义在`org.dom4j`包内,提供了对XML文档进行读写、查询、修改等操作的能力。 1. **Attribute**: 代表XML中的属性,可用于获取和设置属性值。 2. **Branch**: ...

    java中dom4j读写XML

    在Java中,DOM4J提供了一种灵活的方式来操作XML文档,包括解析、遍历、修改节点以及序列化回XML字符串。 **DOM4J的基本概念:** 1. **Element(元素)**:XML文档中的每一个标签都是一个Element,它包含属性、文本...

    dom4j读写xml

    总结,DOM4J作为一款强大的XML处理工具,不仅提供了丰富的API,还支持高效的读写操作和XPath查询,使得开发者能够轻松地进行XML文档的处理和操作。无论是在小型项目还是大型企业级应用中,DOM4J都是处理XML不可或缺...

    DOM4J jar包 xml解析 所有的dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1包 导入直接使用

    导入后,可以按照DOM4J提供的API进行编程,快速实现XML的读写操作。 总之,DOM4J作为一款强大的XML处理工具,为Java开发者提供了丰富的功能和良好的性能,是处理XML文档的理想选择。无论是小型项目还是大型企业级...

    dom4j 解析(读取) xml 节点数据

    如果你需要更精细地控制XML操作,如修改节点或添加新元素,DOM4J也提供了相应的API。 总结起来,DOM4J是处理XML的优秀工具,尤其适合解析具有任意深度的XML结构。通过`SAXReader`解析XML文件,`Document`和`Element...

    dom4j读写xml文件

    在你的`analysisXml`示例中,很可能是通过DOM4J库读取了一个名为`dom4j.xml`的文件,分析其结构,提取或修改数据,然后再将结果写回新的XML文件。这个过程可能包括获取特定元素、遍历元素树、修改属性值,甚至可能...

    java 操作XML 采用(dom+dom4j)读写源码 lib包

    DOM4J是一个非常流行的Java XML API,它扩展了DOM,提供了更方便的操作XML的功能。DOM4J不仅支持DOM,还支持SAX和STAX解析。 读取XML文件: ```java import org.dom4j.DocumentHelper; import org.dom4j.Document; ...

    利用dom4j读写xml实例xmldemo

    DOM4J是Java中一个非常优秀的XML处理库,它提供了丰富的API来处理XML文档,包括读取、写入、修改、查询等功能。本实例"xmldemo"将向我们展示如何利用DOM4J进行XML的读写操作。 首先,理解DOM4J的核心概念。DOM4J...

    Dom4j下载及使用Dom4j读写XML简介

    Dom4j解析教程。详细讲解如何使用dom4j解析xml,简单易懂。

    dom4j_XML.rar_DOM4J_dom4j xml

    总之,DOM4J是处理XML的强大工具,通过使用这个库,开发者可以方便地对XML进行读写、查询和修改。这个"dom4j_XML.rar"压缩包中的实例教程,对于学习和掌握DOM4J的操作技巧,无疑是一份宝贵的资源。

    java 操作xml 源码(包括dom dom4j 读写XML)

    java操作xml源码 操作方式包括:dom和dom4j dom是W3C规范,比较典型的JAVA操作XML方式,适用于小型文件。 dom4j是开源的性能以及效率最好的,也是一个典型例子。...采用dom4j写xml 以及dom4j方式读XML

    使用dom4j操作xml

    ### 使用dom4j操作XML详解 #### 一、DOM4j简介与配置 **DOM4j** 是一款专为Java平台设计的开源XML解析处理工具。它的设计充分考虑了性能和易用性,同时提供了对DOM、SAX及JAXP等标准的支持,因此非常适合进行复杂...

    Dom4j读写XML

    以下是对Dom4j读写XML的详细讲解: 一、Document对象相关 1. **读取XML文件**:通过`SAXReader`实例化并调用`read()`方法,可以将XML文件读取为`Document`对象。例如: ```java SAXReader reader = new ...

    使用dom4j读写XML文档

    ### 使用dom4j读写XML文档的关键知识点 #### 一、简介与安装 - **DOM4J** 是一款用于处理XML文档的Java库,它提供了简单且强大的API来解析、创建、修改XML文档。 - 官方网站:[http://www.dom4j.org/]...

Global site tag (gtag.js) - Google Analytics