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