国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
轉(zhuǎn)換 java 類到 xml 文檔的學(xué)習(xí) - 從終點(diǎn)到起點(diǎn) - JavaEye技術(shù)網(wǎng)站

轉(zhuǎn)換 java 類到 xml 文檔的學(xué)習(xí)

apache 的 betwixt 組件可以實(shí)現(xiàn) java 類到 xml 文檔的轉(zhuǎn)換,但有一定的局限性,如果需要一個(gè)寫下面這個(gè)類的理由的話,“盡其能則用”吧!

(1) IBeanToXml.java 接口。
Java代碼
  1. package com.flysoft.fuse4j.support.xbean;   
  2.   
  3. /**  
  4.  * IBeanToXml 接口實(shí)現(xiàn)將任意對(duì)象轉(zhuǎn)換為數(shù)據(jù)島或XML的方法。  
  5.  * flysoft company.  
  6.  * @author Dingli.  
  7.  * 2008 Apr 22, 2008 5:56:26 PM  
  8.  */  
  9. public interface IBeanToXml   
  10. {   
  11.     /**  
  12.      * 將一個(gè)類解析成 XML 格式。  
  13.      * @param object 要進(jìn)行解析的類。  
  14.      * @param encoding 使用的字符集。  
  15.      * @return 返回解析后的 XML 字符串。  
  16.      */  
  17.     public String parseBeanToXml(Object object, String encoding);   
  18.   
  19.     /**  
  20.      * 將一個(gè)類解析成數(shù)據(jù)島格式。  
  21.      * @param id 數(shù)據(jù)島的ID。  
  22.      * @param object 要解析的對(duì)象。  
  23.      * @param encoding 使用的字符集。  
  24.      * @return 返回解析后的數(shù)據(jù)島字符串。  
  25.      */  
  26.     public String parseBeanToDataIsland(String id, Object object, String encoding);   
  27. }  

(2) BeanToXmlParser.java 類。
Java代碼
  1. package com.flysoft.fuse4j.support.xbean;   
  2.   
  3. import java.lang.reflect.Field;   
  4. import java.lang.reflect.Method;   
  5. import java.lang.reflect.Modifier;   
  6. import java.math.BigDecimal;   
  7. import java.math.BigInteger;   
  8. import java.text.SimpleDateFormat;   
  9. import java.util.Collection;   
  10. import java.util.Date;   
  11. import java.util.Iterator;   
  12. import java.util.Map;   
  13. import org.apache.commons.logging.Log;   
  14. import org.apache.commons.logging.LogFactory;   
  15. import org.dom4j.Document;   
  16. import org.dom4j.DocumentFactory;   
  17. import org.dom4j.Element;   
  18.   
  19. /**  
  20.  * BeanToXmlParser 類實(shí)現(xiàn)將任意對(duì)象轉(zhuǎn)換為數(shù)據(jù)島或XML,但對(duì)象不能循環(huán)引用自身。  
  21.  * flysoft company.  
  22.  * @author Dingli.  
  23.  * 2008 Apr 22, 2008 5:41:07 PM  
  24.  */  
  25. public class BeanToXmlParser implements IBeanToXml   
  26. {   
  27.     //log4j日志記錄器。   
  28.     private static final Log logger = LogFactory.getLog(BeanToXmlParser.class);   
  29.     //簡(jiǎn)單日期格式化對(duì)象。   
  30.     private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");   
  31.   
  32.     /**  
  33.      * 構(gòu)建默認(rèn)的 BeanToXmlParser 對(duì)象。  
  34.      */  
  35.     public BeanToXmlParser()   
  36.     {}   
  37.   
  38.     /*  
  39.      * (non-Javadoc)  
  40.      * @see com.flysoft.fuse4j.support.xbean.IBeanToXml#parseBeanToXml(java.lang.Object, java.lang.String)  
  41.      */  
  42.     public String parseBeanToXml(Object object, String encoding)   
  43.     {   
  44.         try  
  45.         {   
  46.             //應(yīng)為遞歸可能很消耗資源,先進(jìn)行垃圾回收。   
  47.             System.gc();   
  48.             //傳入的對(duì)象必須不能為空。   
  49.             if(object != null)   
  50.             {   
  51.                 //獲取傳入對(duì)象的全類名。   
  52.                 String classPath = object.getClass().getName();   
  53.                 //獲取傳入對(duì)象的類名。   
  54.                 String className = classPath.substring(classPath.lastIndexOf(".") + 1);   
  55.                 //構(gòu)建文檔工廠類對(duì)象。   
  56.                 DocumentFactory documentFactory = DocumentFactory.getInstance();   
  57.                 //構(gòu)建文檔類對(duì)象。   
  58.                 Document document = documentFactory.createDocument(encoding.toUpperCase());   
  59.                 //添加根節(jié)點(diǎn)。   
  60.                 document.addElement(className);   
  61.                 //獲取文檔根節(jié)點(diǎn)。   
  62.                 Element rootNode = document.getRootElement();   
  63.                 //添加根元素的 "class" 屬性。   
  64.                 rootNode.addAttribute("class", classPath);   
  65.                 //插入根元素。   
  66.                 insertElement(rootNode, className.toLowerCase(), object);   
  67.                 //返回表示該文檔的 XML 字符串。   
  68.                 return document.asXML();   
  69.             }   
  70.             else  
  71.             {   
  72.                 return null;   
  73.             }   
  74.         }   
  75.         catch(Exception ex)   
  76.         {   
  77.             logger.error("Parse object to xml string fail", ex);   
  78.             return null;   
  79.         }   
  80.     }   
  81.   
  82.     /*  
  83.      * (non-Javadoc)  
  84.      * @see com.flysoft.fuse4j.support.xbean.IBeanToXml#parseBeanToDataIsland(java.lang.String, java.lang.Object, java.lang.String)  
  85.      */  
  86.     public String parseBeanToDataIsland(String id, Object object, String encoding)   
  87.     {   
  88.         StringBuffer stringBuffer = new StringBuffer();   
  89.         stringBuffer.append("<xml id=\"{id}\">");   
  90.         stringBuffer.append(parseBeanToXml(object, encoding));   
  91.         stringBuffer.append("</xml>");   
  92.         return stringBuffer.toString().replaceAll("[{]id[}]", id);   
  93.     }   
  94.   
  95.     /**  
  96.      * 插入節(jié)點(diǎn)到父節(jié)點(diǎn)元素。  
  97.      * @param parentNode 父節(jié)點(diǎn)元素。  
  98.      * @param nodeName 要插入的節(jié)點(diǎn)名。  
  99.      * @param object 要插入的節(jié)點(diǎn)對(duì)象。  
  100.      */  
  101.     private void insertElement(Element parentNode, String nodeName, Object object)   
  102.     {   
  103.         //如果傳入的對(duì)象為空,則轉(zhuǎn)換為空字符串。   
  104.         object = (object == null)? "": object;   
  105.         //父元素節(jié)點(diǎn)和傳入的對(duì)象均不能為空。   
  106.         if(parentNode != null)   
  107.         {   
  108.             //表示當(dāng)前元素節(jié)點(diǎn)。   
  109.             Element currentNode = null;   
  110.             //獲取傳入對(duì)象的全類名。   
  111.             String classPath = object.getClass().getName();   
  112.             //獲取傳入對(duì)象的類名。   
  113.             String className = classPath.substring(classPath.lastIndexOf(".") + 1).toLowerCase();   
  114.             //傳入的對(duì)象為基本數(shù)據(jù)類型。   
  115.             if(isBaseDataType(object.getClass()))   
  116.             {   
  117.                 //如果節(jié)點(diǎn)名不為空,添加的元素名為節(jié)點(diǎn)名,否則為傳入類的類名。   
  118.                 currentNode = parentNode.addElement((nodeName != null && !nodeName.equals(""))? nodeName: className);   
  119.                 //添加子節(jié)點(diǎn)的值。   
  120.                 currentNode.addText((object instanceof Date)? BeanToXmlParser.simpleDateFormat.format(object): object.toString());   
  121.             }   
  122.             //傳入的對(duì)象為集合類型。   
  123.             else if(object instanceof Collection)   
  124.             {   
  125.                 //插入集合中的對(duì)象到元素。   
  126.                 insertElementFromCollection(parentNode, object);   
  127.             }   
  128.             //傳入的對(duì)象為Map類型。   
  129.             else if(object instanceof Map)   
  130.             {   
  131.                 //插入Map中的對(duì)象到元素。   
  132.                 insertElementFromMap(parentNode, object);   
  133.             }   
  134.             //其他類類型(自定義類型)。   
  135.             else  
  136.             {   
  137.                 //插入自定義的對(duì)象到元素。   
  138.                 insertElementFromOtherObject(parentNode, object);   
  139.             }   
  140.         }   
  141.     }   
  142.   
  143.     /**  
  144.      * 插入節(jié)點(diǎn)到父節(jié)點(diǎn)元素。  
  145.      * @param parentNode 父節(jié)點(diǎn)元素。  
  146.      * @param object 要插入的節(jié)點(diǎn)對(duì)象。  
  147.      */  
  148.     private void insertElement(Element parentNode, Object object)   
  149.     {   
  150.         insertElement(parentNode, null, object);   
  151.     }   
  152.   
  153.     /**  
  154.      * 獲取自定義對(duì)象中的元素做為節(jié)點(diǎn)插入父節(jié)點(diǎn)。  
  155.      * @param parentNode 父節(jié)點(diǎn)。  
  156.      * @param object 要獲取元素的對(duì)象。  
  157.      */  
  158.     private void insertElementFromOtherObject(Element parentNode, Object object)   
  159.     {   
  160.         //表示當(dāng)前元素節(jié)點(diǎn)。   
  161.         Element currentNode = null;   
  162.         //表示字段名。   
  163.         String fieldName = null;   
  164.         //表示類中的getter方法名。   
  165.         String methodName = null;   
  166.         //表示通過(guò)getter方法取得的對(duì)象。   
  167.         Object fieldObject = null;   
  168.         //返回類所定義的字段。   
  169.         Field[] fields = object.getClass().getDeclaredFields();   
  170.         //遍歷所有類字段對(duì)象。   
  171.         for(int i = 0; i < fields.length; i++)   
  172.         {   
  173.             //獲取單個(gè)字段對(duì)象。   
  174.             Field field = fields[i];   
  175.             //獲取字段名。   
  176.             fieldName = field.getName();   
  177.             //獲取以getter起始的方法名。   
  178.             methodName = "get" + Character.toUpperCase(fieldName.charAt(0))+ fieldName.substring(1);   
  179.             try  
  180.             {   
  181.                 //獲取所有的方法對(duì)象。   
  182.                 Method method = object.getClass().getMethod(methodName, null);   
  183.                 //判斷getter方法是否為public。   
  184.                 if(Modifier.isPublic(method.getModifiers()))   
  185.                 {   
  186.                     //判斷從getter方法獲取的對(duì)象是否為空。   
  187.                     if((fieldObject = method.invoke(object, null)) != null && !isBaseDataType(fieldObject.getClass()))   
  188.                     {   
  189.                         //用字段名為節(jié)點(diǎn)名添加一個(gè)節(jié)點(diǎn)元素到指定的父節(jié)點(diǎn)。   
  190.                         currentNode = parentNode.addElement(fieldName);   
  191.                         //添加該節(jié)點(diǎn)元素的"class"屬性。   
  192.                         currentNode.addAttribute("class", fieldObject.getClass().getName());   
  193.                         //添加節(jié)點(diǎn)元素到當(dāng)前新插入的節(jié)點(diǎn)下。   
  194.                         insertElement(currentNode, fieldName, fieldObject);   
  195.                     }   
  196.                     else  
  197.                     {   
  198.                         //添加節(jié)點(diǎn)元素節(jié)點(diǎn)到父節(jié)點(diǎn)下。   
  199.                         insertElement(parentNode, fieldName, fieldObject);   
  200.                     }   
  201.                 }   
  202.             }   
  203.             catch(NoSuchMethodException nex)   
  204.             {}   
  205.             catch(Exception ex)   
  206.             {   
  207.                 logger.error("Get class field fail", ex);   
  208.             }   
  209.         }   
  210.     }   
  211.   
  212.     /**  
  213.      * 獲取Map中的元素做為節(jié)點(diǎn)插入父節(jié)點(diǎn)。  
  214.      * @param parentNode 父節(jié)點(diǎn)。  
  215.      * @param object 要獲取元素的對(duì)象。  
  216.      */  
  217.     private void insertElementFromMap(Element parentNode, Object object)   
  218.     {   
  219.         //獲取傳入對(duì)象的全類名(包括包名)。   
  220.         String classPath = null;   
  221.         //獲取傳入對(duì)象的類名(不包括包名)。   
  222.         String className = null;   
  223.         //表示Map的鍵。   
  224.         Object key = null;   
  225.         //表示Map的值。   
  226.         Object value = null;   
  227.         //表示當(dāng)前元素節(jié)點(diǎn)。   
  228.         Element currentNode = null;   
  229.         //轉(zhuǎn)換Object為Map類型。   
  230.         Map map = (Map)object;   
  231.         //判斷傳入的對(duì)象是否為空。   
  232.         if(map != null)   
  233.         {   
  234.             //遍歷所有鍵集合。   
  235.             for(Iterator keyIterator = map.keySet().iterator(); keyIterator.hasNext();)   
  236.             {   
  237.                 //判斷取得的Map中的鍵是否為空。   
  238.                 if((key = keyIterator.next()) != null)   
  239.                 {   
  240.                     //判斷子元素是否不為空。   
  241.                     if((value = map.get(key)) != null)   
  242.                     {   
  243.                         //判斷子元素是否不為基本數(shù)據(jù)類型。   
  244.                         if(!isBaseDataType(value.getClass()))   
  245.                         {   
  246.                             //獲取傳入對(duì)象的全類名(包括包名)。   
  247.                             classPath = value.getClass().getName();   
  248.                             //獲取傳入對(duì)象的類名(不包括包名)。   
  249.                             className = classPath.substring(classPath.lastIndexOf(".") + 1);   
  250.                             //添加元素到當(dāng)前元素。   
  251.                             currentNode = parentNode.addElement(className);   
  252.                             //添加元素的class屬性。   
  253.                             currentNode.addAttribute("class", classPath);   
  254.                             //插入到當(dāng)前元素。   
  255.                             insertElement(currentNode, value);   
  256.                         }   
  257.                         else  
  258.                         {   
  259.                             //插入到父元素。   
  260.                             insertElement(parentNode, key.toString(), value);   
  261.                         }   
  262.                     }   
  263.                 }   
  264.             }   
  265.         }   
  266.     }   
  267.   
  268.     /**  
  269.      * 獲取集合中的元素做為節(jié)點(diǎn)插入父節(jié)點(diǎn)。  
  270.      * @param parentNode 父節(jié)點(diǎn)。  
  271.      * @param object 要獲取元素的對(duì)象。  
  272.      */  
  273.     private void insertElementFromCollection(Element parentNode, Object object)   
  274.     {   
  275.         //表示當(dāng)前元素節(jié)點(diǎn)。   
  276.         Element currentNode = null;   
  277.         //獲取傳入對(duì)象的全類名(包括包名)。   
  278.         String classPath = null;   
  279.         //獲取傳入對(duì)象的類名(不包括包名)。   
  280.         String className = null;   
  281.         //轉(zhuǎn)換為集合接口對(duì)象。   
  282.         Collection collection = (Collection)object;   
  283.         //集合的子元素。   
  284.         Object subObject = null;   
  285.         //集合對(duì)象不能為空。   
  286.         if(collection != null)   
  287.         {   
  288.             //遍歷所有的集合元素。   
  289.             for(Iterator iterator = collection.iterator(); iterator.hasNext();)   
  290.             {   
  291.                 //判斷獲取的集合的子元素是否為空。   
  292.                 if((subObject = iterator.next()) != null)   
  293.                 {   
  294.                     //判斷子元素是否不為一個(gè)基本數(shù)據(jù)類型。   
  295.                     if(!isBaseDataType(subObject.getClass()))   
  296.                     {   
  297.                         //獲取傳入對(duì)象的全類名(包括包名)。   
  298.                         classPath = subObject.getClass().getName();   
  299.                         //獲取傳入對(duì)象的類名(不包括包名)。   
  300.                         className = classPath.substring(classPath.lastIndexOf(".") + 1);   
  301.                         //添加元素到當(dāng)前元素。   
  302.                         currentNode = parentNode.addElement(className);   
  303.                         //添加元素的class屬性。   
  304.                         currentNode.addAttribute("class", classPath);   
  305.                         //插入到當(dāng)前元素。   
  306.                         insertElement(currentNode, subObject);   
  307.                     }   
  308.                     else  
  309.                     {   
  310.                         //插入到父元素。   
  311.                         insertElement(parentNode, subObject);   
  312.                     }   
  313.                 }   
  314.             }   
  315.         }   
  316.     }   
  317.   
  318.     /**  
  319.      * 判斷一個(gè)類是否為基本數(shù)據(jù)類型。  
  320.      * @param clazz 要判斷的類。  
  321.      * @return true 表示為基本數(shù)據(jù)類型。  
  322.      */  
  323.     private boolean isBaseDataType(Class clazz)   
  324.     {   
  325.         return  
  326.         (   
  327.             clazz.equals(String.class) ||   
  328.             clazz.equals(Integer.class)||   
  329.             clazz.equals(Byte.class) ||   
  330.             clazz.equals(Long.class) ||   
  331.             clazz.equals(Double.class) ||   
  332.             clazz.equals(Float.class) ||   
  333.             clazz.equals(Character.class) ||   
  334.             clazz.equals(Short.class) ||   
  335.             clazz.equals(BigDecimal.class) ||   
  336.             clazz.equals(BigInteger.class) ||   
  337.             clazz.equals(Boolean.class) ||   
  338.             clazz.equals(Date.class) ||   
  339.             clazz.isPrimitive()   
  340.         );   
  341.     }   
  342. }  

用一個(gè) main() 方法來(lái)簡(jiǎn)單表明如何使用。
Java代碼
  1. public class MainClass   
  2. {   
  3.     public static void main(String[] args) throws Exception   
  4.     {   
  5.         try  
  6.         {   
  7.             List rootList = new ArrayList();   
  8.             List subList = new ArrayList();   
  9.             rootList.add("name");   
  10.             rootList.add(new Integer(100));   
  11.             rootList.add(new Float(100.1F));   
  12.             rootList.add(new Double(100.01D));   
  13.             subList.add(new Integer(100));   
  14.             subList.add(new Float(100.1F));   
  15.             subList.add(new Double(100.01D));   
  16.             rootList.add(subList);   
  17.             //java 類到 xml 文檔的解析器。   
  18.             BeanToXmlParser beanToXmlParser = new BeanToXmlParser();   
  19.             //轉(zhuǎn)換為 xml 字符串。   
  20.             System.out.println(beanToXmlParser.parseBeanToXml(rootList));   
  21.         }   
  22.         catch(Exception ex)   
  23.         {   
  24.             ex.printStackTrace();   
  25.         }   
  26.     }   
  27. }  

千萬(wàn)不要問(wèn)為什么我都是在貼代碼,我是個(gè)實(shí)用主義者。如果你有好的點(diǎn)子,長(zhǎng)篇大論一番后。那么,“please, share !”。一個(gè) java 類就像一個(gè)故事,有自己的生命。構(gòu)思良好的類不僅可以讓你事半功倍,而且也極像一件藝術(shù)品。與其讓別人聽(tīng)你的滔滔大論,不如直接讓他們看你是如何做的。雖然“授人以魚,不如授之以漁”,但“拋磚引玉”也未嘗不可!

近來(lái)身體微恙,但對(duì)她的感覺(jué)卻從來(lái)沒(méi)有減少過(guò),她的映像占據(jù)了我的大部分“硬盤空間”,以至于我的“硬盤”七零八落,需要“碎片整理”下了。她對(duì)我還是愛(ài)理不睬,雖然她就在我的左座,我有時(shí)候會(huì)偷偷瞄她(是不是我很沒(méi)有出息),真希望有一天她能接受我,就像當(dāng)初我接受 java 一樣(雖然我不知道我是否選對(duì)),我會(huì)像喜歡 java 一樣深深的愛(ài)護(hù)著她(感覺(jué)是不是在這里談這些有點(diǎn)跑題了)。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Spring+JPA 通用DAO及實(shí)現(xiàn)
org.springside.modules.utils.ReflectionUtils
Struts2中的參數(shù)傳遞
自己實(shí)現(xiàn)簡(jiǎn)單RPC功能
dbutils封裝ORM 實(shí)現(xiàn)BaseDAO
Hessian源碼分析和Hack --讓Hessian攜帶遠(yuǎn)程調(diào)用端的信息
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服