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

          1. 主函數(shù)
          Java代碼 復(fù)制代碼
          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é)點(diǎn)信息
          Java代碼 復(fù)制代碼
          1. /**  
          2.  *  利用反射機(jī)制實(shí)現(xiàn)的 將xml中的相關(guān)信息付給Vo  
          3.  *  輸入:String XML  
          4.  *  返回: void  
          5.  *  執(zhí)行中---將XML數(shù)據(jù) 付給對(duì)應(yīng)的VO :這里需要對(duì)命名進(jìn)行規(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í)行將通過(guò)Xpath解析出來(lái)的節(jié)點(diǎn)下的 信息  付給 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. 反射機(jī)制實(shí)現(xiàn)set方法的動(dòng)態(tài)調(diào)用
          Java代碼 復(fù)制代碼
          1. /**  
          2.      * 輸入: Element 利用Xpath解析出來(lái)要做處理的 Docuemnt 文檔樹(shù)中的階段信息  
          3.      * 輸出: Void  
          4.      * 思路: 讀取XML文件中要做處理的值信息,將值賦給相應(yīng)的VO的字段,這里需要調(diào)用其set方法實(shí)現(xiàn)  
          5.      *       由于不同的VO會(huì)有不同數(shù)量,不同值得字段和set方法,這里采用反射機(jī)制.  
          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();// 獲得字段的名稱(chēng)   
          23.                     fType=fd.getType();// 獲得字段的類(lèi)型   
          24.                     if("java.lang.String".equals(fType.getName())){//判斷字段類(lèi)型是否為String型,由于這里需要利用反射機(jī)制調(diào)用方法而且為了統(tǒng)一實(shí)現(xiàn)   
          25.                         //將VO中的字段都定義為String 型   
          26.                         element=e.getChild(fName);//獲得e(即傳過(guò)來(lái)的Element)下的制定名稱(chēng)的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());//由于屬性名第一個(gè)字母為小寫(xiě)   
          34.                         //為了調(diào)用set方法,將第一個(gè)字母大寫(xiě) 以便構(gòu)造set方法名。 比如 orderId--->OrderId---->setOrderId   
          35.                         if(fName!=null){//如果方法名存在   
          36.                             try {   
          37.                                 m=clazz.getMethod("set"+fName, new Class[]{fType});//通過(guò)方法名獲得 指定的方法參數(shù)類(lèi)型 比如String   
          38.                                 //第一個(gè)參數(shù)指定要調(diào)用方法的名稱(chēng)、第二個(gè)指定調(diào)用方法的參數(shù)類(lèi)型   
          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)用動(dòng)態(tài)生成的方法   
          51.                                 //參數(shù)一指定方法所在的類(lèi),參數(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 閱讀(542) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


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

          常用鏈接

          留言簿(1)

          隨筆檔案(35)

          文章分類(lèi)(5)

          文章檔案(2)

          新聞檔案(5)

          java link

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 疏附县| 内黄县| 黑山县| 琼海市| 临海市| 波密县| 宁津县| 于田县| 神农架林区| 莒南县| 安吉县| 长泰县| 固始县| 轮台县| 罗甸县| 天柱县| 大关县| 柘荣县| 临漳县| 麦盖提县| 凉城县| 浪卡子县| 开平市| 司法| 南丹县| 晋城| 阳山县| 辽源市| 衡阳县| 旬阳县| 苏尼特左旗| 福海县| 三明市| 惠来县| 海口市| 会宁县| 东阳市| 商河县| 肥西县| 四会市| 文登市|