1. 主函數(shù)
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- PaserXML p=new PaserXML();
- String xml="<?xml version='1.0' encoding='UTF-8'?> <root><Customer><id>1</id><name>ddd</name></Customer>"+
- "<order><orderId>2</orderId><orderName>nnmnmnmn</orderName></order></root>";
- p.parserByXpath2(xml);
- }
2. 利用XPath獲得節(jié)點信息
- /**
- * 利用反射機制實現(xiàn)的 將xml中的相關信息付給Vo
- * 輸入:String XML
- * 返回: void
- * 執(zhí)行中---將XML數(shù)據(jù) 付給對應的VO :這里需要對命名進行規(guī)范
- * */
- public void parserByXpath2(String xml){
- try {
- Reader in=new StringReader(xml);
- Document document=builder.build(in);
- Element root=document.getRootElement();
- / System.out.println(root.getName());
- Element o=(Element)org.jdom.xpath.XPath.selectSingleNode(root, "/root/order");
- OrderVO vo=new OrderVO();
- this.ElementTOVO(o, vo);//真正執(zhí)行將通過Xpath解析出來的節(jié)點下的 信息 付給 VO
- System.out.println("vo.getOrderId()"+vo.getOrderId());
- System.out.println("vo.getOrderName()"+vo.getOrderName());
- } catch (JDOMException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
3. 反射機制實現(xiàn)set方法的動態(tài)調(diào)用
- /**
- * 輸入: Element 利用Xpath解析出來要做處理的 Docuemnt 文檔樹中的階段信息
- * 輸出: Void
- * 思路: 讀取XML文件中要做處理的值信息,將值賦給相應的VO的字段,這里需要調(diào)用其set方法實現(xiàn)
- * 由于不同的VO會有不同數(shù)量,不同值得字段和set方法,這里采用反射機制.
- *
- *
- * */
- public void ElementTOVO(Element e,Object vo){
- Class clazz=vo.getClass();
- Field fd=null;
- Method m=null;
- Class fType=null;
- String fName="";
- Element element=null;
- String xmlValue="";
- java.lang.reflect.Method[] method=clazz.getDeclaredMethods();//獲得所有的聲明方法
- java.lang.reflect.Field[] field=clazz.getDeclaredFields();//獲得所有的聲明字段
- for(int i=0;i<field.length;i++){
- fd=field[i];
- fName=fd.getName();// 獲得字段的名稱
- fType=fd.getType();// 獲得字段的類型
- if("java.lang.String".equals(fType.getName())){//判斷字段類型是否為String型,由于這里需要利用反射機制調(diào)用方法而且為了統(tǒng)一實現(xiàn)
- //將VO中的字段都定義為String 型
- element=e.getChild(fName);//獲得e(即傳過來的Element)下的制定名稱的Element fName
- if(element==null){
- xmlValue=null;
- }
- else{
- xmlValue=element.getValue();//獲得指定元素下的值信息
- }
- fName=fName.substring(0,1).toUpperCase()+fName.substring(1,fName.length());//由于屬性名第一個字母為小寫
- //為了調(diào)用set方法,將第一個字母大寫 以便構造set方法名。 比如 orderId--->OrderId---->setOrderId
- if(fName!=null){//如果方法名存在
- try {
- m=clazz.getMethod("set"+fName, new Class[]{fType});//通過方法名獲得 指定的方法參數(shù)類型 比如String
- //第一個參數(shù)指定要調(diào)用方法的名稱、第二個指定調(diào)用方法的參數(shù)類型
- } catch (SecurityException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- } catch (NoSuchMethodException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- if(xmlValue!=null){
- try {
- System.out.println(xmlValue);
- m.invoke(vo, new Object[]{xmlValue});//調(diào)用動態(tài)生成的方法
- //參數(shù)一指定方法所在的類,參數(shù)二制定 參數(shù)的值
- } catch (IllegalArgumentException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- } catch (IllegalAccessException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- } catch (InvocationTargetException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- }
- }
- }