一、XML文件格式

二、List中的Object格式

二、将List对象转换成XML格式的document

三、将XML格式的document转化成List对象

 

        本文可以主要介绍将java中Object类组成的List与自定义格式的XML进行相互转换来实现数据存储与读取。我今天给大家介绍的存储方法只能将同一个Object类的数据存储到同一XML中,但是可以批量存储

一、XML文件格式

       下面是我们自定义的XML格式,changshusocket为根节点,根节点下有三个项,第一项mode是模式,第二项objName是该XML存储的数据对应的Object,第三项tableName是数据库存储的表名。 里面是Object对象的各个变量及其对应值。

 
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  
  3. <changshusocket mode="1" objName="com.jwt.entity.in.PdaDictsCodesEntity" tableName="PDA_DICTS_CODES"> 
  4.   <com.jwt.entity.in.PdaDictsCodesEntity> 
  5.     <n_dmlb>28</n_dmlb> 
  6.     <v_flh>320581005600</v_flh> 
  7.     <v_mc>大义中队</v_mc> 
  8.     <v_sfky>1</v_sfky> 
  9.     <n_pxyj></n_pxyj> 
  10.     <v_xgr></v_xgr> 
  11.     <d_xgsj></d_xgsj> 
  12.     <v_bz></v_bz> 
  13.     <is_delete>0</is_delete> 
  14.     <n_ver>3</n_ver> 
  15.   </com.jwt.entity.in.PdaDictsCodesEntity> 
  16.   <com.jwt.entity.in.PdaDictsCodesEntity> 
  17.     <n_dmlb>37</n_dmlb> 
  18.     <v_flh>6</v_flh> 
  19.     <v_mc>五进宣传</v_mc> 
  20.     <v_sfky>1</v_sfky> 
  21.     <n_pxyj>4</n_pxyj> 
  22.     <v_xgr></v_xgr> 
  23.     <d_xgsj></d_xgsj> 
  24.     <v_bz></v_bz> 
  25.     <is_delete>0</is_delete> 
  26.     <n_ver>3</n_ver> 
  27.   </com.jwt.entity.in.PdaDictsCodesEntity> 
  28. </changshusocket>

二、List中的Object格式

下面是以上XML所对应的实体类:

 
  
  1. package com.jwt.entity.in;  
  2.  
  3. import java.math.BigDecimal;  
  4. import java.util.Date;  
  5.  
  6. import com.traffic.common.annotation.TableAnnotation;  
  7. import com.traffic.common.base.entity.BaseEntity;  
  8.  
  9. @TableAnnotation(table="PDA_DICTS_CODES")  
  10. public class PdaDictsCodesEntity extends BaseEntity  
  11. {  
  12.     private static final long serialVersionUID = 1L;  
  13.  
  14.     @TableAnnotation(isCode=true)  
  15.     private BigDecimal n_dmlb;  
  16.     @TableAnnotation(isCode=true)  
  17.     private String v_flh;  
  18.     @TableAnnotation 
  19.     private String v_mc;  
  20.     @TableAnnotation 
  21.     private String v_sfky;  
  22.     @TableAnnotation 
  23.     private BigDecimal n_pxyj;  
  24.     @TableAnnotation 
  25.     private String v_xgr;  
  26.     @TableAnnotation 
  27.     private Date d_xgsj;  
  28.     @TableAnnotation 
  29.     private String v_bz;  
  30.       
  31.     @TableAnnotation 
  32.     private String is_delete;  
  33.           
  34.     @TableAnnotation 
  35.     private BigDecimal n_ver;  
  36.       
  37.     public BigDecimal getN_ver() {  
  38.         return n_ver;  
  39.     }  
  40.  
  41.     public void setN_ver(BigDecimal n_ver) {  
  42.         this.n_ver = n_ver;  
  43.     }  
  44.       
  45.     public String getIs_delete() {  
  46.         return is_delete;  
  47.     }  
  48.     public void setIs_delete(String is_delete) {  
  49.         this.is_delete = is_delete;  
  50.     }  
  51.     /**  
  52.      * @return the n_dmlb  
  53.      */ 
  54.     public BigDecimal getN_dmlb()  
  55.     {  
  56.         return n_dmlb;  
  57.     }  
  58.     /**  
  59.      * @param nDmlb the n_dmlb to set  
  60.      */ 
  61.     public void setN_dmlb(BigDecimal nDmlb)  
  62.     {  
  63.         n_dmlb = nDmlb;  
  64.     }  
  65.     /**  
  66.      * @return the v_flh  
  67.      */ 
  68.     public String getV_flh()  
  69.     {  
  70.         return v_flh;  
  71.     }  
  72.     /**  
  73.      * @param vFlh the v_flh to set  
  74.      */ 
  75.     public void setV_flh(String vFlh)  
  76.     {  
  77.         v_flh = vFlh;  
  78.     }  
  79.     /**  
  80.      * @return the v_mc  
  81.      */ 
  82.     public String getV_mc()  
  83.     {  
  84.         return v_mc;  
  85.     }  
  86.     /**  
  87.      * @param vMc the v_mc to set  
  88.      */ 
  89.     public void setV_mc(String vMc)  
  90.     {  
  91.         v_mc = vMc;  
  92.     }  
  93.       
  94.     /**  
  95.      * @return the v_sfky  
  96.      */ 
  97.     public String getV_sfky()  
  98.     {  
  99.         return v_sfky;  
  100.     }  
  101.     /**  
  102.      * @param vSfky the v_sfky to set  
  103.      */ 
  104.     public void setV_sfky(String vSfky)  
  105.     {  
  106.         v_sfky = vSfky;  
  107.     }  
  108.     /**  
  109.      * @return the n_pxyj  
  110.      */ 
  111.     public BigDecimal getN_pxyj()  
  112.     {  
  113.         return n_pxyj;  
  114.     }  
  115.     /**  
  116.      * @param nPxyj the n_pxyj to set  
  117.      */ 
  118.     public void setN_pxyj(BigDecimal nPxyj)  
  119.     {  
  120.         n_pxyj = nPxyj;  
  121.     }  
  122.     /**  
  123.      * @return the v_xgr  
  124.      */ 
  125.     public String getV_xgr()  
  126.     {  
  127.         return v_xgr;  
  128.     }  
  129.     /**  
  130.      * @param vXgr the v_xgr to set  
  131.      */ 
  132.     public void setV_xgr(String vXgr)  
  133.     {  
  134.         v_xgr = vXgr;  
  135.     }  
  136.     /**  
  137.      * @return the d_xgsj  
  138.      */ 
  139.     public Date getD_xgsj()  
  140.     {  
  141.         return d_xgsj;  
  142.     }  
  143.     /**  
  144.      * @param dXgsj the d_xgsj to set  
  145.      */ 
  146.     public void setD_xgsj(Date dXgsj)  
  147.     {  
  148.         d_xgsj = dXgsj;  
  149.     }  
  150.     /**  
  151.      * @return the v_bz  
  152.      */ 
  153.     public String getV_bz()  
  154.     {  
  155.         return v_bz;  
  156.     }  
  157.     /**  
  158.      * @param vBz the v_bz to set  
  159.      */ 
  160.     public void setV_bz(String vBz)  
  161.     {  
  162.         v_bz = vBz;  
  163.     }  
  164. }  

三、将List对象转换成XML格式的document

 
  
  1. private static void genDomFromList(Document document,  
  2.             SendMessage sendMessage) {  
  3.         // TODO Auto-generated method stub  
  4.         ArrayList list = sendMessage.getList();  
  5.         int mode = sendMessage.getMode();  
  6.         String processName = sendMessage.getProcessName();  
  7.         try {  
  8.  
  9.             if ((list != null) && (list.size() > 0)) {  
  10.                 String elementName = list.get(0).getClass().getName();  
  11.                 //访问类中所有的字段  
  12.                 Field[] fields = list.get(0).getClass().getDeclaredFields();  
  13.                 //从配置文件文件中获取根节点名称  
  14.                 Element _root = document.addElement(Props.getInstance()  
  15.                         .getProp("XmlRoot"));  
  16.                 //根节点的第一项为模式  
  17.                 _root.addAttribute("mode", String.valueOf(mode));  
  18.                 // 根节点第二项为类名  
  19.                 _root.addAttribute("objName", elementName);  
  20.                 //根节点第三项为数据库表名  
  21.                 _root.addAttribute("tableName", processName);  
  22.                 //遍历list中所有的类  
  23.                 for (Iterator localIterator = list.iterator(); localIterator  
  24.                         .hasNext();) {  
  25.                     Object item = localIterator.next();  
  26.                     Element elementTemp = _root.addElement(elementName);  
  27.                     //遍历类中的每一项,来确定将类中的值转化为我们所需要的添加入document  
  28.                     for (int i = 0; i < fields.length; i++)  
  29.                         if (!fields[i].getName().equals("serialVersionUID")) {  
  30.                             Element elementTemp1 = elementTemp  
  31.                                     .addElement(fields[i].getName());  
  32.                             boolean accessFlag = fields[i].isAccessible();  
  33.                             fields[i].setAccessible(true);  
  34.                             Object objText = null;  
  35.                             try {  
  36.                                 objText = fields[i].get(item);  
  37.                             } catch (Exception e) {  
  38.                                 log.error("class反射读取失败:", e);  
  39.                             }  
  40.                             if (objText == null)  
  41.                                 elementTemp1.setText("");  
  42.                             else if ((objText instanceof Date)) {  
  43.                                 elementTemp1.setText(DateTool.parseString(  
  44.                                         (Date) objText, null));  
  45.                             } else if (fields[i].getType().getName()  
  46.                                     .equals("[B"))  
  47.                                 elementTemp1.setText(encoder  
  48.                                         .encode((byte[]) objText));  
  49.                             else 
  50.                                 elementTemp1.setText(objText.toString());  
  51.                             fields[i].setAccessible(accessFlag);  
  52.                         }  
  53.                 }  
  54.             }  
  55.         } catch (Exception e) {  
  56.             log.error("list转为dom失败:", e);  
  57.         }  
  58.     } 

四、将XML格式的document转化成List对象

 
  
  1. private static String[] genListFromDom(ArrayList list, Document document) {  
  2.         // TODO Auto-generated method stub  
  3.         try {  
  4.             Element root = document.getRootElement();  
  5.             //根节点的第一项为模式  
  6.             String mode = root.attributeValue("mode");  
  7.             //根节点的第二项为数据库表名  
  8.             String tableName = root.attributeValue("tableName");  
  9.             //根节点的第三项为类名  
  10.             String elementName = root.attributeValue("objName");  
  11.             //new一个名为elementName的类  
  12.             Object obj = Class.forName(elementName).newInstance();  
  13.             //取XML根节点下名为elementName的子节点,并暂时存放为list  
  14.             List<Element> elements = root.elements(elementName);  
  15.             //遍历XML中取得的elements  
  16.             for (Element item : elements) {  
  17.                 //新建一个类来专门对应每一个对应的emement  
  18.                 Object objTemp = obj.getClass().newInstance();  
  19.                 //访问类中所有的字段  
  20.                 Field[] fields = obj.getClass().getDeclaredFields();  
  21.                 //遍历类中的每一个字段  
  22.                 for (int i = 0; i < fields.length; i++) {  
  23.                     if (fields[i].getName().equals("serialVersionUID"))  
  24.                         continue;  
  25.                     if (item.elementIterator(fields[i].getName()).hasNext()) {  
  26.                         boolean accessFlag = fields[i].isAccessible();  
  27.                         fields[i].setAccessible(true);  
  28.                         //取得对应字段的值  
  29.                         String textTemp = item.element(fields[i].getName())  
  30.                                 .getText();  
  31.                         //取得对应字段的类型  
  32.                         String propertyType = fields[i].getType().getName();  
  33.                         //若值不为空,将对应字段的值转化为对应类型后存入Object对应的字段fields  
  34.                         if ((textTemp != null) && (!textTemp.trim().equals(""))) {  
  35.                             if (propertyType.endsWith("String"))  
  36.                                 fields[i].set(objTemp, textTemp);  
  37.                             else if ("char".equals(propertyType))  
  38.                                 fields[i].set(objTemp,  
  39.                                         Character.valueOf(textTemp.charAt(0)));  
  40.                             else if (("int".equals(propertyType))  
  41.                                     || (propertyType.endsWith("Integer")))  
  42.                                 fields[i].set(objTemp, Integer.valueOf(Integer  
  43.                                         .parseInt(textTemp)));  
  44.                             else if (("boolean".equals(propertyType))  
  45.                                     || (propertyType.endsWith("Boolean")))  
  46.                                 fields[i].set(objTemp, Boolean.valueOf(Boolean  
  47.                                         .parseBoolean(textTemp)));  
  48.                             else if (("byte".equals(propertyType))  
  49.                                     || (propertyType.endsWith("Byte")))  
  50.                                 fields[i].set(objTemp,  
  51.                                         Byte.valueOf(Byte.parseByte(textTemp)));  
  52.                             else if (("short".equals(propertyType))  
  53.                                     || (propertyType.endsWith("Short")))  
  54.                                 fields[i].set(objTemp, Short.valueOf(Short  
  55.                                         .parseShort(textTemp)));  
  56.                             else if (("double".equals(propertyType))  
  57.                                     || (propertyType.endsWith("Double")))  
  58.                                 fields[i].set(objTemp, Double.valueOf(Double  
  59.                                         .parseDouble(textTemp)));  
  60.                             else if (("long".equals(propertyType))  
  61.                                     || (propertyType.endsWith("Long")))  
  62.                                 fields[i].set(objTemp,  
  63.                                         Long.valueOf(Long.parseLong(textTemp)));  
  64.                             else if (("float".equals(propertyType))  
  65.                                     || (propertyType.endsWith("Float")))  
  66.                                 fields[i].set(objTemp, Float.valueOf(Float  
  67.                                         .parseFloat(textTemp)));  
  68.                             else if (propertyType.endsWith("BigInteger"))  
  69.                                 fields[i]  
  70.                                         .set(objTemp, new BigInteger(textTemp));  
  71.                             else if (propertyType.endsWith("BigDecimal"))  
  72.                                 fields[i]  
  73.                                         .set(objTemp, new BigDecimal(textTemp));  
  74.                             else if ((!"void".equals(propertyType))  
  75.                                     && (!propertyType.endsWith("Void"))) {  
  76.                                 if (propertyType.endsWith("Date"))  
  77.                                     fields[i].set(objTemp,  
  78.                                             DateTool.parseDate(textTemp, null));  
  79.                                 else if (propertyType.equals("[B")) {  
  80.                                     fields[i].set(objTemp,  
  81.                                             decoder.decodeBuffer(textTemp));  
  82.                                 }  
  83.                             }  
  84.                         }  
  85.                         fields[i].setAccessible(accessFlag);  
  86.                     }  
  87.                 }  
  88.                 list.add(objTemp);  
  89.             }  
  90.             return new String[] { mode, tableName };  
  91.         } catch (Exception e) {  
  92.             log.error("dom转为list失败:", e);  
  93.         }  
  94.         return (String[]) null;  
  95.     }