posts - 35,  comments - 6,  trackbacks - 0
          引言:XML和J2EE密切的程度是不用說的了,由于我們的接口程序需要將別人發(fā)過來的XML文檔信息進行處理,并持久化到數(shù)據(jù)庫中。由于業(yè)務的不同,xml的格式也有所不同,不過執(zhí)行的過程都是類似的,我們獲得xml字符串信息并解析我們需要的信息,將這些信息持久化就ok了,這里存在的問題是隨著業(yè)務的不同,xml格式不同需要將xml中的信息首先保存到不同的vo中,然后將vo持久化。這樣反射機制就起了很大的作用。

          1. 主函數(shù)
          Java代碼 復制代碼
          1.     public static void main(String[] args) {   
          2.         // TODO Auto-generated method stub   
          3.         PaserXML p=new PaserXML();   
          4.         String xml="<?xml version='1.0' encoding='UTF-8'?> <root><Customer><id>1</id><name>ddd</name></Customer>"+   
          5. "<order><orderId>2</orderId><orderName>nnmnmnmn</orderName></order></root>";   
          6.   
          7.         p.parserByXpath2(xml);   
          8.     }  


          2. 利用XPath獲得節(jié)點信息
          Java代碼 復制代碼
          1. /**  
          2.  *  利用反射機制實現(xiàn)的 將xml中的相關信息付給Vo  
          3.  *  輸入:String XML  
          4.  *  返回: void  
          5.  *  執(zhí)行中---將XML數(shù)據(jù) 付給對應的VO :這里需要對命名進行規(guī)范  
          6.  * */  
          7.   
          8. public void parserByXpath2(String xml){   
          9.        
          10.      try {   
          11.             Reader in=new StringReader(xml);   
          12.             Document document=builder.build(in);   
          13.             Element root=document.getRootElement();   
          14. /               System.out.println(root.getName());   
          15.             Element o=(Element)org.jdom.xpath.XPath.selectSingleNode(root, "/root/order");   
          16.             OrderVO vo=new OrderVO();   
          17.             this.ElementTOVO(o, vo);//真正執(zhí)行將通過Xpath解析出來的節(jié)點下的 信息  付給 VO   
          18.             System.out.println("vo.getOrderId()"+vo.getOrderId());   
          19.             System.out.println("vo.getOrderName()"+vo.getOrderName());   
          20.         } catch (JDOMException e) {   
          21.             // TODO Auto-generated catch block   
          22.             e.printStackTrace();   
          23.         } catch (IOException e) {   
          24.             // TODO Auto-generated catch block   
          25.             e.printStackTrace();   
          26.         }   
          27.        
          28. }  


          3. 反射機制實現(xiàn)set方法的動態(tài)調(diào)用
          Java代碼 復制代碼
          1. /**  
          2.      * 輸入: Element 利用Xpath解析出來要做處理的 Docuemnt 文檔樹中的階段信息  
          3.      * 輸出: Void  
          4.      * 思路: 讀取XML文件中要做處理的值信息,將值賦給相應的VO的字段,這里需要調(diào)用其set方法實現(xiàn)  
          5.      *       由于不同的VO會有不同數(shù)量,不同值得字段和set方法,這里采用反射機制.  
          6.      *         
          7.      *         
          8.      * */  
          9. public void ElementTOVO(Element e,Object vo){   
          10.                
          11.         Class clazz=vo.getClass();   
          12.         Field fd=null;   
          13.         Method m=null;   
          14.         Class fType=null;   
          15.         String fName="";   
          16.         Element element=null;   
          17.         String xmlValue="";   
          18. java.lang.reflect.Method[] method=clazz.getDeclaredMethods();//獲得所有的聲明方法   
          19.                 java.lang.reflect.Field[] field=clazz.getDeclaredFields();//獲得所有的聲明字段   
          20.                 for(int i=0;i<field.length;i++){   
          21.                     fd=field[i];   
          22.                     fName=fd.getName();// 獲得字段的名稱   
          23.                     fType=fd.getType();// 獲得字段的類型   
          24.                     if("java.lang.String".equals(fType.getName())){//判斷字段類型是否為String型,由于這里需要利用反射機制調(diào)用方法而且為了統(tǒng)一實現(xiàn)   
          25.                         //將VO中的字段都定義為String 型   
          26.                         element=e.getChild(fName);//獲得e(即傳過來的Element)下的制定名稱的Element fName    
          27.                         if(element==null){   
          28.                             xmlValue=null;   
          29.                         }   
          30.                         else{   
          31.                             xmlValue=element.getValue();//獲得指定元素下的值信息   
          32.                         }   
          33.                         fName=fName.substring(0,1).toUpperCase()+fName.substring(1,fName.length());//由于屬性名第一個字母為小寫   
          34.                         //為了調(diào)用set方法,將第一個字母大寫 以便構造set方法名。 比如 orderId--->OrderId---->setOrderId   
          35.                         if(fName!=null){//如果方法名存在   
          36.                             try {   
          37.                                 m=clazz.getMethod("set"+fName, new Class[]{fType});//通過方法名獲得 指定的方法參數(shù)類型 比如String   
          38.                                 //第一個參數(shù)指定要調(diào)用方法的名稱、第二個指定調(diào)用方法的參數(shù)類型   
          39.                             } catch (SecurityException e1) {   
          40.                                 // TODO Auto-generated catch block   
          41.                                 e1.printStackTrace();   
          42.                             } catch (NoSuchMethodException e1) {   
          43.                                 // TODO Auto-generated catch block   
          44.                                 e1.printStackTrace();   
          45.                             }   
          46.                         }   
          47.                         if(xmlValue!=null){   
          48.                             try {   
          49.                                 System.out.println(xmlValue);   
          50.                                 m.invoke(vo, new Object[]{xmlValue});//調(diào)用動態(tài)生成的方法   
          51.                                 //參數(shù)一指定方法所在的類,參數(shù)二制定 參數(shù)的值   
          52.                             } catch (IllegalArgumentException e1) {   
          53.                                 // TODO Auto-generated catch block   
          54.                                 e1.printStackTrace();   
          55.                             } catch (IllegalAccessException e1) {   
          56.                                 // TODO Auto-generated catch block   
          57.                                 e1.printStackTrace();   
          58.                             } catch (InvocationTargetException e1) {   
          59.                                 // TODO Auto-generated catch block   
          60.                                 e1.printStackTrace();   
          61.                             }   
          62.                         }   
          63.                     }   
          64.                 }   
          65.             }  
          posted on 2009-08-31 09:23 NG 閱讀(540) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          <2009年8月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(1)

          隨筆檔案(35)

          文章分類(5)

          文章檔案(2)

          新聞檔案(5)

          java link

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 武冈市| 广元市| 常熟市| 渭源县| 澄迈县| 甘泉县| 乡宁县| 全椒县| 东平县| 嘉峪关市| 台中县| 乐陵市| 樟树市| 大洼县| 满洲里市| 确山县| 永嘉县| 洪泽县| 高尔夫| 靖边县| 象州县| 林甸县| 庄浪县| 富阳市| 太原市| 原阳县| 周宁县| 邻水| 淳安县| 禹州市| 扎囊县| 灌南县| 南投市| 江阴市| 开封县| 林周县| 资阳市| 什邡市| 兰州市| 沧源| 思茅市|