首先來看個例子吧~~~
這是我的一段測試代碼:
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 stubProduct 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專區。
有興趣的 也可以向我索要源碼。