posts - 35,  comments - 6,  trackbacks - 0
引言:XML和J2EE密切的程度是不用说的了,由于我们的接口程序需要将别人发过来的XML文档信息进行处理,并持久化到数据库中。由于业务的不同,xml的格式也有所不同,不过执行的过程都是类似的,我们获得xml字符串信息并解析我们需要的信息,将这些信息持久化就ok了,这里存在的问题是随着业务的不同,xml格式不同需要将xml中的信息首先保存到不同的vo中,然后将vo持久化。这样反射机制就起了很大的作用。

1. 主函数
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获得节点信息
Java代码 复制代码
  1. /**  
  2.  *  利用反射机制实现的 将xml中的相关信息付给Vo  
  3.  *  输入:String XML  
  4.  *  返回: void  
  5.  *  执行中---将XML数据 付给对应的VO :这里需要对命名进行规范  
  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);//真正执行将通过Xpath解析出来的节点下的 信息  付给 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. 反射机制实现set方法的动态调用
Java代码 复制代码
  1. /**  
  2.      * 输入: Element 利用Xpath解析出来要做处理的 Docuemnt 文档树中的阶段信息  
  3.      * 输出: Void  
  4.      * 思路: 读取XML文件中要做处理的值信息,将值赋给相应的VO的字段,这里需要调用其set方法实现  
  5.      *       由于不同的VO会有不同数量,不同值得字段和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型,由于这里需要利用反射机制调用方法而且为了统一实现   
  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.                         //为了调用set方法,将第一个字母大写 以便构造set方法名。 比如 orderId--->OrderId---->setOrderId   
  35.                         if(fName!=null){//如果方法名存在   
  36.                             try {   
  37.                                 m=clazz.getMethod("set"+fName, new Class[]{fType});//通过方法名获得 指定的方法参数类型 比如String   
  38.                                 //第一个参数指定要调用方法的名称、第二个指定调用方法的参数类型   
  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});//调用动态生成的方法   
  51.                                 //参数一指定方法所在的类,参数二制定 参数的值   
  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 阅读(535) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(1)

随笔档案(35)

文章分类(5)

文章档案(2)

新闻档案(5)

java link

搜索

  •  

最新评论

阅读排行榜

评论排行榜