`
Kevin12
  • 浏览: 235996 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

dom4j解析xml,dom4j 将对象解析到xml文件中以流的方式输出到服务器

    博客分类:
  • Java
阅读更多
最近做流程项目用到了dom4j,于是就对dom4j进行了大概的学习。我做的流程项目是jbpm4的,实现的功能是将流程用到的表从mysql数据库中导出,通过dom4j解析成xml文件,导出到客户端,这是流程的导出;也可以将导出的流程xml文件导入到mysql数据库中。别的不多说,下面我通过一个例子总结我对dom4j的学习。
首先创建一个测试项目dom4jTest,在项目的src目录下面创建一个pojo:Person.java代码如下:
package com.lujinyong.dom4j;

/**
 * 
 * @Description: person类用来测试java反射在dom4j中的使用
 * @Author: lujinyong
 */
public class Person {
	private int id;// 用户id
	private String name;// 用户名称
	private String sex;// 性别
	private int age;// 年龄
	private String address;// 住址

	public Person(int id, String name, String sex, int age, String address) {
		this.id = id;
		this.name = name;
		this.sex = sex;
		this.age = age;
		this.address = address;
	}
       /**这里将setter和getter方法省略了*/
	//重新toString()方法
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", sex=" + sex
				+ ", age=" + age + ", address=" + address + "]";
	}
}

下面是Map和Pojo之间转换的通用方法:MapPojoUtils.java作为工具类
package com.lujinyong.dom4j;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.commons.beanutils.BeanUtils;
/**
 * 
 * @Description: map和pojo之间的转换
 * @Author: lujinyong
 */
public class MapPojoUtils {
	/**
	 * 将map转换成对应的Pojo 类
	 * @param 要转换成的对像
	 * @param map要转换的map
	 * @return
	 */
	public static Object map2Pojo(Object o, Map map) {
		Set<Map.Entry<String, Object>> set = map.entrySet();
		for (Map.Entry<String, Object> entry : set) {
			if (entry.getValue() instanceof java.util.Date) {
				Date d = (Date) entry.getValue();
				map.put(entry.getKey(), MapPojoUtils.addDate(d, 0));
			}
		}
		BeanUtils bu = new BeanUtils();
		try {
			bu.populate(o, map);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return o;
	}

	/**
	 * 将pojo 对像转换成map
	 * @param obj
	 * @return
	 */
	public static Map pojo2Map(Object obj) {
		Map hashMap = new HashMap();
		Class c = obj.getClass();
		Field f[] = c.getDeclaredFields();
		Method method;
		String fieldName;
		for (Field field : f) {
			fieldName = field.getName();
			try {
				method = c.getDeclaredMethod("get"
						+ fieldName.substring(0, 1).toUpperCase()
						+ fieldName.substring(1));
				hashMap.put(fieldName, method.invoke(obj));
			} catch (Throwable e) {
				System.err.println(e);
			}
		}
		return hashMap;
	}
	/**
	 * 日期递增
	 * @param currentDate
	 * @param addNum
	 * @return
	 */
	public static Date addDate(Date currentDate,int addNum) {
		Calendar calender = Calendar.getInstance();
		calender.setTime(currentDate);
		calender.add(Calendar.DATE, addNum);
		Date date = calender.getTime();
		return date;
	}
}

因为实际项目中直接用的是数据库,但是在这个例子中为了简单我不是用数据库了,而是创建一个类来模拟数据库:MyDataSource.java
package com.lujinyong.dom4j;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @Description:数据源,用了模拟数据库
 * @Author: lujinyong
 */
public class MyDataSource {
	/**
	 * 
	 * @Description: 获取10个person信息
	 * @Auther: lujinyong
	 */
	public static List<Person> getPersonList() {
		List<Person> list = new ArrayList<Person>();
		for (int i = 0; i < 10; i++) {
			Person p = new Person();
			p.setId(i);
			p.setName("张三" + i);
			p.setSex(((int) (Math.random() * 100)) % 2 == 0 ? "女" : "男");
			p.setAge(((int) (Math.random() * 100)));
			p.setAddress("中国");
			list.add(p);
		}
		return list;
	}
}

以上准备是为最重要的部分dom4j的解析做准备,关键类在下面:Dom4jTest.java
package com.lujinyong.dom4j;

import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

/**
 * 
 * @Description: 该类测试dom4j的基本使用
 * @Author: lujinyong
 */
public class Dom4jTest {
	/**
	 * 
	 * @Description:将对象转成xml文件 
	 * @Auther: lujinyong
	 */
	@Test
	public void pojo2Xml(){
		/**1.创建document*/
		Document document = DocumentHelper.createDocument();
		/**2.添加根元素*/
		Element rootElement = document.addElement("root");
		/**3.用反射将person写到xml中*/
		List<Person> list = MyDataSource.getPersonList();
		for(Person person:list){
			rootElement = Dom4jTest.object2Element(rootElement, person, String.valueOf(person.getId()));
		}
		/**4.将document写到xml中并保存到服务器指定的目录中*/
		FileOutputStream xmlOut;
		try {
			xmlOut = new FileOutputStream(new File("d:/person.xml"));
			XMLWriter xmlWriter = new XMLWriter(xmlOut,OutputFormat.createPrettyPrint());
			xmlWriter.write(document);
			xmlWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 
	 * @Description:将对应的对象写到xml中 
	 * @Auther: lujinyong
	 */
	public static Element object2Element(Element root,Object obj,String id){
		try {
			//获取Document根元素
			Class clazz = obj.getClass();
			//获取对象名称
			String str = clazz.getName();
			String objName = str.substring(str.lastIndexOf(".")+1);
			//获取对象元素(以表名为标签的元素),不存在,则创建
			Element tableElement = root.element(objName);
			if(tableElement == null){
				tableElement = root.addElement(objName).addAttribute("id", id);
			}
			//创建一个节点元素
			Element nodeElement = tableElement.addElement("node").addAttribute("id", id);
			Field[] fields = clazz.getDeclaredFields();
			//遍历属性
			for(Field field :fields){
				/**拼接出属性对应的getter方法名*/
				//获取对象属性
				String fieldName = field.getName();
				StringBuilder sb = new StringBuilder();
				sb.append("get");
				sb.append(fieldName.substring(0,1).toUpperCase());
				if(fieldName.length()>1){
					sb.append(fieldName.substring(1));
				}
				String getMethodName = sb.toString();
				//反射method对象
				Method getMethod = obj.getClass().getMethod(getMethodName);
				//调用方法获取值
				Object fieldValue = getMethod.invoke(obj);
				//添加节点子元素元素
				Element fieldElement = nodeElement.addElement(fieldName).addAttribute(fieldName, fieldName);
				fieldElement.setText(fieldValue==null?"":fieldValue.toString());
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return root;
	}
	/**
	 * 
	 * @Description: 将xml中的数据转成Person对象
	 * @Auther: lujinyong
	 */
	@Test
	public void xml2Sql(){
		String filePath = "d:/person.xml";
		List<Person> list = new ArrayList<Person>();
		SAXReader reader = new SAXReader();
		try {
			/**1.读取xml文件,生成document*/
			Document document = reader.read(new File(filePath));
			/**2.将xml的流程节点信息保存到节点表中*/
			List<Element> nodeList = document.getRootElement().element("Person").elements("node");
			Map<String,Object> map = new HashMap<String, Object>();
			for(Element e : nodeList){
				List<Element> temp = e.elements();
				for(Element t : temp){
					map.put(t.getName(), t.getText());
				}
				Person person = (Person) MapPojoUtils.map2Pojo(new Person(), map);
				list.add(person);
			}
			for(Person p : list){
				System.out.println(p.toString());
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

运行pojo2Xml()方法,则在d盘中会创建一个person.xml文件,打开文件,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>

<root>
  <Person id="0">
    <node id="0">
      <id id="id">0</id>
      <name name="name">张三0</name>
      <sex sex="sex">女</sex>
      <age age="age">1</age>
      <address address="address">中国</address>
    </node>
    <node id="1">
      <id id="id">1</id>
      <name name="name">张三1</name>
      <sex sex="sex">男</sex>
      <age age="age">0</age>
      <address address="address">中国</address>
    </node>
    <node id="2">
      <id id="id">2</id>
      <name name="name">张三2</name>
      <sex sex="sex">女</sex>
      <age age="age">66</age>
      <address address="address">中国</address>
    </node>
    <node id="3">
      <id id="id">3</id>
      <name name="name">张三3</name>
      <sex sex="sex">女</sex>
      <age age="age">44</age>
      <address address="address">中国</address>
    </node>
    <node id="4">
      <id id="id">4</id>
      <name name="name">张三4</name>
      <sex sex="sex">男</sex>
      <age age="age">50</age>
      <address address="address">中国</address>
    </node>
    <node id="5">
      <id id="id">5</id>
      <name name="name">张三5</name>
      <sex sex="sex">男</sex>
      <age age="age">67</age>
      <address address="address">中国</address>
    </node>
    <node id="6">
      <id id="id">6</id>
      <name name="name">张三6</name>
      <sex sex="sex">女</sex>
      <age age="age">25</age>
      <address address="address">中国</address>
    </node>
    <node id="7">
      <id id="id">7</id>
      <name name="name">张三7</name>
      <sex sex="sex">女</sex>
      <age age="age">53</age>
      <address address="address">中国</address>
    </node>
    <node id="8">
      <id id="id">8</id>
      <name name="name">张三8</name>
      <sex sex="sex">男</sex>
      <age age="age">84</age>
      <address address="address">中国</address>
    </node>
    <node id="9">
      <id id="id">9</id>
      <name name="name">张三9</name>
      <sex sex="sex">男</sex>
      <age age="age">94</age>
      <address address="address">中国</address>
    </node>
    <node id="10">
      <id id="id">10</id>
      <name name="name">张三10</name>
      <sex sex="sex">女</sex>
      <age age="age">48</age>
      <address address="address">中国</address>
    </node>
  </Person>
</root>

运行xml2Sql()方法,则可以将d盘中创建的person.xml文件进行解析,并转成POJO,此时如果有数据库就可以将转成的POJO保存的数据库中了。
总结一下,该例子中用到的重要知识点:java的反射,dom4j解析。
还有一个比较实用的工具类Map和POJO之间的转化。

永久链接:http://kevin12.iteye.com/blog/1940281
分享到:
评论

相关推荐

    dom4j解析xml详解

    12. **Node**: 为DOM4J中的所有XML节点提供一个多态接口,包括`Element`、`Attribute`、`Comment`等,简化了节点类型的处理。 13. **NodeFilter**: 定义了节点过滤器的行为,可以在遍历节点时应用条件筛选。 14. **...

    dom4j解析xml文件的压缩包

    5. **事件驱动解析(SAX)**:除了传统的DOM解析外,DOM4J还支持SAX解析器,这种解析方式适用于处理大型XML文件,因为它不需要一次性加载整个文档到内存。 6. **Namespace支持**:DOM4J提供了对XML命名空间的全面...

    dom4j解析xml文件(增删改查)

    在“dom4j解析xml文件(增删改查)”这个主题中,我们将深入探讨如何使用DOM4J来实现XML文档的四种基本操作:增加元素、删除元素、更新元素内容以及查询元素。 首先,让我们了解DOM4J的基本用法。在解析XML文件时,...

    使用 dom4j 解析 XML

    使用 dom4j 解析 XML dom4j 解析 XML dom4j解析xml

    java dom4j解析xml

    Java DOM4J解析XML是一种常见的处理XML文档的技术,它提供了灵活且高效的API,使得开发者能够方便地读取、写入、修改以及操作XML文件。DOM4J是Java中一个非常强大的XML处理库,它结合了DOM、SAX和JDOM的优点,同时也...

    dom4j 解析写入xml

    1、xml文档解析 2、 dom4j解析xml 3、实现xml文件解析 xml字符串解析 xml MAP键值对解析 4、实现xml写入与生成文件

    DOM4J 解析XML

    DOM4J不仅是一个解析XML的工具,还可以用作XML数据绑定库,将XML数据映射到Java对象。此外,DOM4J还支持Java 5的注解,这使得XML文档的处理更加直观和简洁。结合其灵活性和高性能,DOM4J成为Java开发人员处理XML文档...

    分别使用DOM和DOM4j解析XML文件

    本篇文章将详细介绍如何使用DOM(Document Object Model)和DOM4j这两种流行的方法来解析XML文件。 首先,DOM是一种标准的W3C推荐的解析XML的方法,它将整个XML文档加载到内存中,形成一个树形结构,便于程序进行...

    用dom4j解析xml文件

    XPath允许我们以表达式方式快速定位XML中的节点,而SAX和StAX解析器则适用于处理大型XML文件,它们不需要一次性加载整个文档到内存,从而降低了内存消耗。 总之,DOM4J是Java中处理XML的强大工具,通过其丰富的API...

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

    接下来,我们将创建一个`SAXReader`实例,它是DOM4J中的解析器,用于读取XML文件: ```java SAXReader reader = new SAXReader(); ``` 然后,使用`reader`读取XML文件并获取`Document`对象,`Document`代表整个XML...

    dom4j解析xml

    #### 四、XPath表达式在DOM4J中的应用 DOM4J支持XPath表达式来查询XML文档中的节点,XPath表达式是查询XML文档的一种强大工具,能够精确地定位到文档中的任意节点。 - **基本的XPath表达式**: - `/AAA/BBB/CCC`...

    dom4j解析xml文件代码示例

    在本示例中,我们将深入探讨如何使用DOM4J解析XML文件,以`CacheInit.java`作为我们的核心代码示例,并参考`emailTemplateConfig.xml`作为实际操作的对象。 首先,让我们了解XML(eXtensible Markup Language)。...

    dom4j解析xml实例

    DOM4J是一个非常流行的、强大的Java XML API,它提供了灵活且高效的方式来解析、创建、修改XML文档。本文将深入探讨如何使用DOM4J进行XML解析,并通过实例来帮助理解。 首先,让我们了解DOM4J的基本概念。DOM4J是...

    dom4j解析XML所需jar包

    2. **XML解析**:DOM4J支持多种解析方式,包括SAX(Simple API for XML)和DOM。SAX是基于事件的解析,适用于处理大文件;DOM则将整个XML文档加载到内存,适合小规模或内存允许的情况。DOM4J还提供了StAX(Streaming...

    dom4j 解析xml实例

    在这个实例中,我们将深入探讨如何使用DOM4J解析XML文件,并通过`Dom4jTest1.java`这个示例程序来理解其工作原理。 首先,我们需要了解XML(Extensible Markup Language)是一种标记语言,常用于存储和传输数据。...

    使用dom4j 和本地dom 解析xml 文件

    DOM解析方式是将整个XML文件加载到内存中,形成一棵DOM树,每个节点代表XML文档的一部分。这种方式适合小型XML文件,因为大型文件会消耗大量内存。在Java中,DOM解析主要通过`javax.xml.parsers....

    xmldom4j解析

    总之,DOM4J作为强大的XML处理工具,提供了丰富的功能,使得在Java中解析、操作XML变得简单而高效。结合“jar包执行20190331.rar”文件中的实例,开发者可以深入学习和实践DOM4J的使用,进一步提升XML处理能力。

Global site tag (gtag.js) - Google Analytics