问题描述
本人由于经常需要调用webService接口。由于开发起来每次都需要编写XML比较混乱所以写了个小程序方便换转。首先所有的xmlbean需要放到同一个包内节点名和bean中字段名相同。希望能有高手把这个改的效率更高点。本机执行超过5000行后效率一般。/***获取实体类第一层文件夹**@paramobject*@return*/publicStringgetFloderUrl(Objectobject){Class<?>getFloderUrl=object.getClass();StringsplitString=object.getClass().getSimpleName();StringfloderUrl=getFloderUrl.toString().split(splitString)[0];returnfloderUrl.split("class")[1];}/***XML变模型反射:节点与Bean相同的话可以用此方法自动赋值**@authorWangRz*@paramdocument*@paramobj*@paramfloderUrl*@return*@throwsClassNotFoundException*@throwsInstantiationException*@throwsIllegalAccessException*@throwsDocumentException*@throwsSecurityException*@throwsNoSuchFieldException*/publicObjectxmlToBean(Documentdocument,Objectobj,StringfloderUrl)throwsClassNotFoundException,InstantiationException,IllegalAccessException,DocumentException,SecurityException,NoSuchFieldException{Elementroot=document.getRootElement();Field[]fields=obj.getClass().getDeclaredFields();for(inti=0,len=fields.length;i<len;i++){StringvarName=fields[i].getName();booleanaccessFlag=fields[i].isAccessible();fields[i].setAccessible(true);Stringval=root.elementText(varName);Class<?>type=fields[i].getType();if(type.equals(String.class)){//TODO处理String节点fields[i].set(obj,val);}elseif(type.equals(List.class)){//TODO处理List节点@SuppressWarnings("unchecked")List<Element>elements=root.elements(fields[i].getName());if(elements.size()!=0){StringnewClassString=fields[i].toString().split("")[2];String[]strings=newClassString.split("[.]");intstringLenth=strings.length-1;StringbeanName=strings[stringLenth];Class<?>newClass=Class.forName(floderUrl+beanName);List<Object>newVals=newArrayList<Object>();for(intj=0;j<elements.size();j++){ObjectnewObjects=newClass.newInstance();DocumentnewDocument=getNewDocument(elements.get(j));ObjectnewVal=xmlToBean(newDocument,newObjects,floderUrl);newVals.add(newVal);}fields[i].set(obj,newVals);}}elseif(type.equals(Array.class)){//TODO处理Array@SuppressWarnings("unchecked")List<Element>elements=root.elements(fields[i].getName());if(elements.size()!=0){StringnewClassString=fields[i].toString().split("")[2];String[]strings=newClassString.split("[.]");intstringLenth=strings.length-1;StringbeanName=strings[stringLenth];Class<?>newClass=Class.forName(floderUrl+beanName);Object[]newVals=newObject[elements.size()];for(intj=0;j<elements.size();j++){ObjectnewObjects=newClass.newInstance();DocumentnewDocument=getNewDocument(elements.get(j));ObjectnewVal=xmlToBean(newDocument,newObjects,floderUrl);newVals[j]=newVal;}fields[i].set(obj,newVals);}}else{Elementelement=root.element(fields[i].getName());if(null!=element){DocumentnewDocument=getNewDocument(element);Class<?>newType=fields[i].getType();ObjectnewObject=newType.newInstance();ObjectnewVal=xmlToBean(newDocument,newObject,floderUrl);fields[i].set(obj,newVal);}}fields[i].setAccessible(accessFlag);}returnobj;}privateDocumentgetNewDocument(Elementelement)throwsDocumentException{DocumentnewDocument=DocumentHelper.parseText(SETUP_XML_HEAD+element.asXML());returnnewDocument;}/***反射将实体类转化为XML**@authorWangRz*@date2011/10/04*@paramobject*@return*@throwsDocumentException*/@SuppressWarnings("unchecked")publicDocumentbeanToXml(Objectobject)throwsDocumentException{Documentdocument=DocumentHelper.createDocument();StringobjName=object.getClass().getSimpleName();//TODO获取类名Elementelement=DocumentHelper.createElement(objName);//TODO根据类名创造根节点Field[]fields=object.getClass().getDeclaredFields();//TODO获取该类的所有字段名for(inti=0,len=fields.length;i<len;i++){try{intflag=0;//TODO控制元素集合StringvarName=fields[i].getName();booleanaccessFlag=fields[i].isAccessible();//TODO设置Accessiblefields[i].setAccessible(true);ObjectobjValues=fields[i].get(object);ElementobjElement=null;//TODO创建元素获取节点if(null!=objValues){objElement=DocumentHelper.createElement(varName);//TODO根据字段名创建节点if(objValues.getClass().equals(String.class)){objElement.setText(objValues.toString());//TODOString类型则直接赋值}elseif(objValues.equals("")){//TODO如果为字符串空值则保留该节点objElement.setName(varName);}elseif(objValues.getClass().equals(ArrayList.class)){//TODO如果为数组则循环处理List<Object>list=newArrayList<Object>();list=(List<Object>)objValues;for(ObjectlstObject:list){//TODO循环取出每个节点DocumentsonDocument=beanToXml(lstObject);//TODO递归处理该节点if(sonDocument.getRootElement().elements().size()!=0){//TODO如果该数组长度不为0则将处理过的元素赋值到上层节点中element.add(sonDocument.getRootElement());flag=1;//TODO将flag标记为1不再重新赋值element}}}else{ElementsonElement=beanToXml(objValues).getRootElement();//TODO如果该类型为模型类则递归处理该object并将根节点赋值到Element中element.add(sonElement);flag=1;//TODO将flag标记为1不再重新赋值element}}fields[i].setAccessible(accessFlag);if(null!=objElement&&flag!=1){element.add(objElement);//TODO如果尚未添加过element且Obj元素不为空则将其添加到element中}}catch(Exceptione){e.printStackTrace();}}document.setRootElement(element);returndocument;}调用方法publicstaticvoidmain(String[]args)throwsDocumentException{SAXReadersaxReader=newSAXReader();NewbusinessCommonnewCommon=newNewbusinessCommon();DocumentproductDocument=saxReader.read("F://productModel.xml");rootroot=newroot();StringfloderUrl=newCommon.getFloderUrl(root);try{root=(com.hbdoone.wss.web.myspace.newbusiness.orderengine.model.productoffermodel.root)newCommon.xmlToBean(productDocument,root,floderUrl);getProductAttrInfo(root.getProductOfferModel().getOfferDetailInfo().get(0));}catch(SecurityExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(InstantiationExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IllegalAccessExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(NoSuchFieldExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}