关闭

使用dom4j 把xml格式解析为对象或者对象集合

标签: xmldom4j解析 对象 集合
6295人阅读 评论(1) 收藏 举报
分类:

  android开发里经常会遇到后台传来xml格式的数据,需要我们把它们解析后变成对象或者集合, dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、所以我们用dom4j解析xml,把其转化为对象,或者集合,使用之前导入dom4j.jar架包

        1、把下面的xml 转化为person的对象

<resp>
    <name>jack</name>
    <age>21</age>
    <birthday>1990-02-01</birthday>
    <sex>man</sex>
</resp>
      2、 把下面的xml 转化为person集合

<resp>
    <desc>0</desc>
    <depict>ok</depict>
    <content>
        <name>jack</name>
        <age>21</age>
        <birthday>1990-02-01</birthday>
        <sex>man</sex>
    </content>
    <content>
        <name>jack</name>
        <age>21</age>
        <birthday>1990-02-01</birthday>
        <sex>man</sex>
    </content>
    <content>
        <name>jack</name>
        <age>21</age>
        <birthday>1990-02-01</birthday>
        <sex>man</sex>
    </content>
</resp>
   下面直接贴代码了:

   Person类:

  

 public class Person {

	 private String name;
	 private String age;
	 private String birthday;
	 private String sex;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	 

}


   Dom4jUtil类

 

import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
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.SAXReader;
import org.xml.sax.InputSource;

public class Dom4jUtil {

	/**
	 * @param args
	 * @throws DocumentException
	 */
	public static void main(String[] args) throws DocumentException {
		// TODO Auto-generated method stub

		String xml = "<resp>" + "<name>jack</name>" + "<age>21</age>"
				+ "<birthday>1990-02-01</birthday>" + "<sex>man</sex>"
				+ "</resp>";
		Person student = getPerson(xml);
		System.out.println(student.getName() + "|" + student.getAge() + "|"
				+ student.getBirthday() + "|" + student.getSex());
		System.out.println("person对象");
		String modelXMl = "<name>jack</name>" + "<age>21</age>"
				+ "<birthday>1990-02-01</birthday>" + "<sex>man</sex>";
		String xmlList = "<resp>" + "<desc>0</desc>" + "<depict>ok</depict>"
				+ "<content>" + modelXMl + "</content>" + "<content>"
				+ modelXMl + "</content>" + "<content>" + modelXMl
				+ "</content>" + "</resp>";
		System.out.println("person集合列表");
		List<Person> list = getPersonList(xmlList);
		for (Person person : list) {
			System.out.println(person.getName() + "|" + person.getAge() + "|"
					+ person.getBirthday() + "|" + person.getSex());
		}
	}

	/**
	 * 把xml格式转化为person对象
	 * 
	 * @param xml
	 * @return
	 */
	public static Person getPerson(String xml) {
		Person person = null;
		InputSource in = new InputSource(new StringReader(xml));
		in.setEncoding("UTF-8");
		SAXReader reader = new SAXReader();
		Document document;
		try {
			document = reader.read(in);
			Element root = document.getRootElement();
			person = (Person) XmlUtil.fromXmlToBean(root, Person.class);

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("数据解析错误");

		}
		return person;
	}

	/**
	 * 把xml转化为person集合
	 * 
	 * @param xml
	 * @return
	 */
	public static List<Person> getPersonList(String xml) {

		Document doc = null;
		List<Person> list = new ArrayList<Person>();
		try {

			// 读取并解析XML文档

			// SAXReader就是一个管道,用一个流的方式,把xml文件读出来

			// SAXReader reader = new SAXReader(); //User.hbm.xml表示你要解析的xml文档

			// Document document = reader.read(new File("User.hbm.xml"));

			// 下面的是通过解析xml字符串的

			doc = DocumentHelper.parseText(xml); // 将字符串转为XML

			Element rootElt = doc.getRootElement(); // 获取根节点

			System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称

			String returnCode = rootElt.elementTextTrim("desc");
			if (!"0".equals(returnCode)) {
				System.out.println("后台数据返回有问题");
				return null;
			}

			Iterator<Element> it = rootElt.elementIterator("content");// 获取根节点下所有content
			while (it.hasNext()) {
				Element elementGroupService = (Element) it.next();
				Person baseBean = (Person) XmlUtil.fromXmlToBean(
						elementGroupService, Person.class);
				list.add(baseBean);
			}

		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("数据解析错误");
		}

		return list;
	}

}
     XmlUtil类:

import java.lang.reflect.Field;
import java.util.Date;

import org.dom4j.Element;

public class XmlUtil
{
	/**
	 * json 数据转换对象
	 * 
	 * @param Element
	 *            要转换的Element数据
	 * @param pojo
	 *            要转换的目标对象类型
	 * @return 转换的目标对象
	 * @throws Exception
	 *             转换失败
	 */
	@SuppressWarnings("rawtypes")
	public static Object fromXmlToBean(Element rootElt, Class pojo) throws Exception
	{
		// 首先得到pojo所定义的字段
		Field[] fields = pojo.getDeclaredFields();
		// 根据传入的Class动态生成pojo对象
		Object obj = pojo.newInstance();
		for (Field field : fields)
		{
			// 设置字段可访问(必须,否则报错)
			field.setAccessible(true);
			// 得到字段的属性名
			String name = field.getName();
			// 这一段的作用是如果字段在Element中不存在会抛出异常,如果出异常,则跳过。
			try
			{
				rootElt.elementTextTrim(name);
			}
			catch (Exception ex)
			{
				continue;
			}
			if (rootElt.elementTextTrim(name) != null && !"".equals(rootElt.elementTextTrim(name)))
			{
				// 根据字段的类型将值转化为相应的类型,并设置到生成的对象中。
				if (field.getType().equals(Long.class) || field.getType().equals(long.class))
				{
					field.set(obj, Long.parseLong(rootElt.elementTextTrim(name)));
				}
				else if (field.getType().equals(String.class))
				{
					field.set(obj, rootElt.elementTextTrim(name));
				}
				else if (field.getType().equals(Double.class) || field.getType().equals(double.class))
				{
					field.set(obj, Double.parseDouble(rootElt.elementTextTrim(name)));
				}
				else if (field.getType().equals(Integer.class) || field.getType().equals(int.class))
				{
					field.set(obj, Integer.parseInt(rootElt.elementTextTrim(name)));
				}
				else if (field.getType().equals(java.util.Date.class))
				{
					field.set(obj, Date.parse(rootElt.elementTextTrim(name)));
				}
				else
				{
					continue;
				}
			}
		}
		return obj;
	}
}
运行结果:


1
1
查看评论

dom4j将xml转换成对象

dom4j将xml转换成对象
  • cowbin2012
  • cowbin2012
  • 2015-08-03 23:29
  • 3290

用dom4j实现对象和xml文件的互相转换

用dom4j实现对象和xml文件互相转换
  • chenhuanchuan
  • chenhuanchuan
  • 2017-08-30 11:15
  • 1500

复杂XML与复杂java对象的相互转换

/**  * Title: XMLUtil.java  * Description:   * @author baymax  * @time 创建时间:2018年1月9日 下午4:18:13  *   *&#...
  • weixin_40112859
  • weixin_40112859
  • 2018-01-10 16:06
  • 41

Java Dom4j 操作XML

经常使用的操作包括: * 1,读取节点的值 * 2,新增节点: *   2.1,添加子节点:根据子节点名称和内容添加;根据子节点xml添加 *   2.2,添加兄弟节点 *   2.3,为节点/hym...
  • qq_21911655
  • qq_21911655
  • 2018-01-04 19:44
  • 26

XML和对象相互转换的方法

最近项目中需要用到XML配置一些信息,百度了一下,发现使用XStream相对简单,简单配置一下即可进行转换,方法如下: 首先添加依赖 com.thoughtworks.xstream xstream 1.4.3 ...
  • dreamfly88
  • dreamfly88
  • 2016-09-19 18:02
  • 3193

java关于对象(javabean)与xml之间的相互转换

今天我们要探讨的一个问题是,如何将xml格式的字符串转换成对象,以及对象转换成xml字符串。 简介 现如今,虽然数据的传输大部分都是用json格式来进行传输,但是xml毕竟也会有一些老的项目在进行使用,身为一个万能的程序员。我们又怎能不会使用它呢?正常的老式方法是通过获取节点来进行一系列操作,个...
  • liboyang71
  • liboyang71
  • 2017-06-14 17:21
  • 4229

玩转Java对象和XML相互转换

最近在项目中一直出现Java对象和XML之间的相互转换,一开始由于项目很庞大,我又是临时调度过去,导致在按照项目组长的要求进行写代码的同时,总是在这块云里雾里,最近才慢慢开始搞清楚项目中具体的使用缘由。但是项目中封装的代码总是很庞大,因为要考虑太多的东西,而对于此,我只能通过小的Demo来说明,其实...
  • songdeitao
  • songdeitao
  • 2013-12-13 18:39
  • 31430

对象转xml和xml轻松转对象

  • 2009-07-07 16:08
  • 133KB
  • 下载

Xml文件转化为对象,对象转化为Xml

Stream用来将xml转化为对象,或则将对象转化为xml,xml与Json的转化
  • mejustdoit
  • mejustdoit
  • 2015-07-15 15:52
  • 2698

xml字符串转换成对象

/// /// xml字符串转换成对象 /// /// /// /// public T XMLStringToObject(string xmlStr) { ...
  • sniper007
  • sniper007
  • 2016-12-20 12:32
  • 2600
    个人资料
    • 访问:18878次
    • 积分:354
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类