Java 将对象解析成xml 文件

28 篇文章 3 订阅
11 篇文章 0 订阅

首先来看个例子吧~~~

这是我的一段测试代码:

package com.domain;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import org.dreamer.parse.xml.XMLBean;
import org.dreamer.parse.xml.XMLSupport;

import com.pan.action.Product;

public class XMLTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Product product=new Product();
		product.setAddTime(new Timestamp(100));
		product.setBidPrice(12d);
		product.setDescription("产品的描述信息");
		product.setId(1);
		product.setImg("图片");
		product.setName("IPHONE5");
		product.setPrice(3000d);
		product.setStock(12);
		product.setSupplier("美国");
		Human human=new Human();
		human.setProduct(product);
		List list=new ArrayList();
		list.add(product);
		list.add(product);
		list.add(product);
		list.add(human);
		System.out.println(new XMLSupport().parseCollection(list));
		
	}

}

通过对bean 进行赋值 之后,然后 运行得到结果:

<?xml version="1.0" encoding="UTF-8"?>
<items>
<Product>
  <id>1</id>
  <name>IPHONE5</name>
  <description>产品的描述信息</description>
  <img>图片</img>
  <stock>12</stock>
  <bidPrice>12.0</bidPrice>
  <price>3000.0</price>
  <weight>null</weight>
  <unit>null</unit>
  <supplier>美国</supplier>
  <addTime>1970-01-01 08:00:00.1</addTime>
</Product>
<Product>
  <id>1</id>
  <name>IPHONE5</name>
  <description>产品的描述信息</description>
  <img>图片</img>
  <stock>12</stock>
  <bidPrice>12.0</bidPrice>
  <price>3000.0</price>
  <weight>null</weight>
  <unit>null</unit>
  <supplier>美国</supplier>
  <addTime>1970-01-01 08:00:00.1</addTime>
</Product>
<Product>
  <id>1</id>
  <name>IPHONE5</name>
  <description>产品的描述信息</description>
  <img>图片</img>
  <stock>12</stock>
  <bidPrice>12.0</bidPrice>
  <price>3000.0</price>
  <weight>null</weight>
  <unit>null</unit>
  <supplier>美国</supplier>
  <addTime>1970-01-01 08:00:00.1</addTime>
</Product>
<Human>
  <id>null</id>
  <type>null</type>
<Product>
  <id>1</id>
  <name>IPHONE5</name>
  <description>产品的描述信息</description>
  <img>图片</img>
  <stock>12</stock>
  <bidPrice>12.0</bidPrice>
  <price>3000.0</price>
  <weight>null</weight>
  <unit>null</unit>
  <supplier>美国</supplier>
  <addTime>1970-01-01 08:00:00.1</addTime>
</Product>
</Human>
</items>


这里可以看到,是将集合进行解析,并且还解析了对象中的对象。可以无限的解析下去。

接下来看看实现类:

核心代码:

XMLBean.java(该类的主要作用就是利用反射,取得对象的相关信息)

package org.dreamer.parse.xml;

import java.lang.reflect.Field;

import org.dreamer.parse.dao.IDataParse;
import org.dreamer.parse.util.NodeUtil;
import org.dreamer.parse.util.TypeCollection;

public class XMLBean  implements IDataParse{

	public String getString(Object object) {
		//类对象
		Class cl=object.getClass();
		//列名
		String domName=cl.getSimpleName();
		//字段数组
		Field []fields=cl.getDeclaredFields();
		//信息存放对象
		StringBuffer sb=new StringBuffer();
		sb.append("<"+domName+">\r\n");
		//遍历取值
		for (Field field : fields) {
			//字段可访问
			field.setAccessible(true);
			try {
				
				Object value=field.get(object)==null?"null":field.get(object);
				if(!new TypeCollection().check(value)&&value!=null){
					sb.append(getString(value));
					continue;
				}
				sb.append(NodeUtil.merge(field.getName(), value));
				
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		}
		sb.append("</"+domName+">\r\n");
		return sb.toString();
	}
	
	public String toString(){
		
		return getString(this);
	}
	

}
在来看看支持类,

支持类,就是对XMLBean 进行了一个封装

可以解析集合和单个对象

XMLBean.java

package org.dreamer.parse.xml;

import java.util.Collection;

import org.dreamer.parse.dao.IDataSupport;
import org.dreamer.parse.util.NodeUtil;
/**
 * XML解析支持类
 * @author Pan
 *
 */
public class XMLSupport implements IDataSupport{

	//解析集合时默认的名称
	private String nodeName="items";
	/**
	 * 如果要自定义节点名称,需要重写该方法
	 * @param nodeName
	 */
	public void setNodeName(String nodeName) {
		this.nodeName = nodeName;
	}
	public String getNodeName() {
		return nodeName;
	}
	/**
	 * 将对象解析成xml
	 */
	public String parseString(Object object){
		
		XMLBean xml=new XMLBean();
		StringBuffer sb=new StringBuffer();
		//追加描述头
		sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
		
		return sb.append(xml.getString(object)).toString();
	}
	
	/**
	 * 将对象集合解析成xml
	 */
	public String parseCollection(Collection collection){
		
		StringBuffer sb=new StringBuffer();
		sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
		sb.append("<"+nodeName+">\r\n");
		XMLBean xml=new XMLBean();
		
		for (Object object : collection) {
			sb.append(xml.getString(object));
		}
		sb.append("</"+nodeName+">\r\n");
		return sb.toString();
	}
	
}
接下来是Util类,Util的作用也不小哦。

DataHelper.java (这个类其实可以有也可以没有,主要是用来判断一个类型的)

package org.dreamer.parse.util;

import java.sql.Timestamp;

public class DataHelper {
	
	/**
	 * 检查是否是String和Timestamp类型
	 * @param object
	 * @return
	 */
	public static boolean check(Object object){
		return object instanceof String || object instanceof Timestamp;
	}
}
NodeUtil.java 这个类是生成节点标签的

package org.dreamer.parse.util;
/**
 * 节点合并工具类
 * @author Pan
 *
 */
public class NodeUtil {

	public static String merge(String node,Object value){
		
		StringBuffer sb=new StringBuffer();
		
			sb.append("  <"+node+">");
			sb.append(value);
			sb.append("</"+node+">\r\n");
		
		return sb.toString();
	}
}

TypeCollection.java
这个类也很重要,主要是来判断解析的字段是不是对象,如果是对象,得调用递归进行解析

package org.dreamer.parse.util;

import java.lang.reflect.Field;
import java.sql.Timestamp;
/**
 * 基础类型集合
 * @author Pan
 *
 */
public class TypeCollection {

	/**
	 * 基础数据类型的包装类
	 */
	private Integer integer;
	private Double double1;
	private Float float1;
	private Long long1;
	private String string;
	private Character character;
	private Boolean boolean1;
	private Short short1;
	private Timestamp timestamp;

	/**
	 * 检查该对象是不是基础数据类型
	 * @param object
	 * @return
	 */
	public boolean check(Object object) {

		if(object==null)
			return false;
		
		// 获取当前类的Class对象的字段集合
		Field[] fields = this.getClass().getDeclaredFields();
		for (Field field : fields) {
			// 设置字段可访问
			field.setAccessible(true);

			// 获取字段类型来比较
			if (field.getType().getName().equals(object.getClass().getName())) {
				return true;
			}

		}
		return false;
	}
}
上面就实现了一个完整的XML解析过程。

上面的这些代码都是从Dreamer框架延伸出来的,有兴趣可以看看我博客的Dreamer专区。

有兴趣的 也可以向我索要源码。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值