XML 转 实体 实体转XML 小方法。。欢迎讨论

问题描述

本人由于经常需要调用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();}}

时间: 2024-09-12 23:19:19

XML 转 实体 实体转XML 小方法。。欢迎讨论的相关文章

简单实体类和xml文件的相互转换方法

最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简单的模型,可以将简单的实体类和xml文件进行相互转换,但对实体类的属性类型有限制,目前只支持String, Integer, Double三种类型.但是后面可以扩展. 我的大概思路是这样的,只要能拿到实体类的类型信息,我就能拿到实体类的全部字段名称和类型,拼属性的set和get方法更是简单明了,这时

C#实现XML与实体类之间相互转换的方法(序列化与反序列化)_C#教程

本文实例讲述了C#实现XML与实体类之间相互转换的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Xml; using System.Xml.Serialization; /// <summary> /// Xml序列化与反序列化 //

dalvik-在做xml与java实体类的转换时,导入的jar包都会让eclipse报错

问题描述 在做xml与java实体类的转换时,导入的jar包都会让eclipse报错 我开始用XStream,后来又根据网上的代码导入javax.xml.bind包来进行解析,但是这两种都会报错:Conversion to Dalvik format failed with error 1,我百了一下,也不是很明白,还请大家解答,先谢谢各位了.. 解决方案 可以试下这个方案http://dev.wo.com.cn/docportal/doc_queryMdocDetail.action?mdoc

编码-【求教求教求教求教】:关于XML中ENTITY实体元素互相引用

问题描述 [求教求教求教求教]:关于XML中ENTITY实体元素互相引用 在XML的DOCTYPE中可以定义实体,形式如下:<!DOCTYPE now [ <!ENTITY aa ""xxx""> ]> 这样在xml中可以&aa;形式引用实体aa,就相当于在xml文档中插入了"xxx"字符串.在此有一个问题,如果ENTITY实体元素互相引用的话,那么在解析器解析xml节点时,岂不会引起死循环吗?形式如下:<?

帮忙看看下面的实体类是怎么生成的?XML生成JAVA 实体类

问题描述 ////ThisfilewasgeneratedbytheJavaTMArchitectureforXMLBinding(JAXB)ReferenceImplementation,v2.2.4-2//See<ahref="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>//Anymodificationstothisfilewillbelostuponrecompilation

用到xml文件-C#初学者学到XML文件部分写了个小程序

问题描述 C#初学者学到XML文件部分写了个小程序 错误 1 "CSharp.Study.XML.XmlOperation"不实现接口成员"CSharp.Study.XML.IFileOperation.Save(string, string)"."CSharp.Study.XML.XmlOperation.Save(string, string)"无法实现"CSharp.Study.XML.IFileOperation.Save(st

javascript解析xml实现省市县三级联动的方法_javascript技巧

本文实例讲述了javascript解析xml实现省市县三级联动的方法.分享给大家供大家参考.具体实现方法如下: (该方法适用于任何常用浏览器) <body> <div> <span> <select id="sheng" style="width: 100px"></select> </span> <span> <select id="shi" style=

Java获取XML节点总结之读取XML文档节点的方法_java

dom4j是Java的XML API,用来读写XML文件的.目前有很多场景中使用dom4j来读写xml的. 要使用dom4j开发,需要下载导入dom4j相应的jar文件. 官网下载:http://www.dom4j.org/dom4j-1.6.1/ github下载:http://dom4j.github.io/ 下载解压之后如图所示: 我们只需要把dom4j-1.6.1.jar文件构建到我们开发项目中就可以了. 下面就以Eclipse创建java项目的构建方法为例说明: 声明:本Java项目的

JavaScript实现将xml转换成html table表格的方法_javascript技巧

本文实例讲述了JavaScript实现将xml转换成html table表格的方法.分享给大家供大家参考.具体如下: function ConvertToTable(targetNode) { // if the targetNode is xmlNode this line must be removed // i couldnt find a way to parse xml string to xml node // so i parse xml string to xml documen

配置pom.xml用maven打包java工程的方法(推荐)_java

最近由于项目需要,研究了一下maven的打包,项目要做到 1,生成3个目录/lib,/conf,/bin目录 2,把所有的jar目录编译.拷贝到/lib目录(包括maven的jar包和lib目录下的jar,以及编译的jar包) 3,把所有的启动脚本从工程根目录拷贝到/bin目录 4,把所有的配置文件从src/main/resources拷贝到/conf  下面是配置的pom.xml,我把相关的配置都加了注释,一看就能明白,把build节点拷贝到你们的项目中,就基本可以用了:) <project