首先来看个例子吧~~~
这是我的一段测试代码:
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专区。
有兴趣的 也可以向我索要源码。