simple-xml2object组件禁止用于商业用途,作者:左潇龙。
前段时间公司的WebService接口需要处理xml数据,主要就是和对象之间的互相转换,传输的时候用xml,后台使用的时候转换成对象,所以就有了xml和object之间经常的互相转换。
也用过一个工具叫jaxb,但是感觉有点过大,所以自己开发了一个简易组件,可以实现xml和object的互相转换,带有中文异常处理,虽说没英文显得专业,但感觉中文更实用,其中提示了所有异常产生最有可能的原因,还附带纯中文CHM文档,并保留了扩展性,有兴趣的也可以自己实现自己的转换机制。
在此分享给各位,如果有同样需求的,可以考虑,jar包大小25KB,无需其余依赖包。
另外如果哪位在使用过程中有发现bug或者其他问题,可以在此留言,或者发我邮箱150349407@qq.com,我会及时更改。
目前最初始的版本1.0.0主要支持的功能有:
1.xml转换成object,并且可扩展实现自己的解析器,另外目前还不支持直接转换成一个对象的list,但是可以重复调用解析方法,同样可以产生一个list,有时间的话,下一版本会考虑直接支持此功能。
2.object转换成xml,支持xml格式的配置,包含无格式,只带换行的格式以及标准格式(也就是格式化以后的样子)。
3.两种转换都支持日期格式的配置。
4.考虑到我们平时项目中对象的一个序列属性大部分是list或者是set的,所以此版本只支持属性为list或者set的,相信足够了。
jar包和CHM文档我已经打包,在我的资源里面可以免费下载。
下面是我专门为此组件写的一个测试类,用法简单明了,有详细的注释。
import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.xml2object.simple.container.ConfigurableContainer; import com.xml2object.simple.container.Container; import com.xml2object.simple.parser.ConfigurableXmlBulider; import com.xml2object.simple.parser.XmlBulider.Format; import com.xml2object.simple.support.DefaultConfigurableContainer; public class Test { String stringParam = "stringValue"; Date dateParam = new Date(); Test testParam; List<Test> testListParam; public static void main(String[] args) throws IOException { //不可配置的容器 Container container = new DefaultConfigurableContainer(Test.class); //向容器中添加一个复杂的Test对象 container.add(createTest()); //获取容器自动解析的xml内容 String xml = container.getXml(); //将xml内容存放在一个文件中 write("E:/test1.xml", xml); //可配置的容器,使用可配置的容器接口,推荐此种方式,比较灵活 ConfigurableContainer configurableContainer = new DefaultConfigurableContainer(Test.class); //获取容器中的xml构建器 ConfigurableXmlBulider xmlBulider = configurableContainer.getXmlBulider(); //设置构建器的xml格式 xmlBulider.setFormat(Format.TAB_AND_LINE); //设置构建器的日期格式 xmlBulider.setDateFormat("yyyy-MM-dd hh:mm:ss"); //改变容器中的构建器 configurableContainer.setXmlBulider(xmlBulider); //向可配置容器添加复杂对象 configurableContainer.add(createTest()); //获取容器自动解析的xml内容,比较下不能配置的容器构建的xml格式和日期格式 String configXml = configurableContainer.getXml(0);//等同于getXml() //将xml内容存放在一个文件中 write("E:/test2.xml", configXml); //再将xml从test2.xml中读取出来 String readableConfigXml = read("E:/test2.xml"); //向容器中再加入一个xml configurableContainer.add(readableConfigXml); //获取容器自动解析的对象 //因为之前已经加入了一个对象,所以在加入xml之前,容器中已包含一对xml和object,此时索引为1 Test test = configurableContainer.getObject(1); //打印容器大小 System.out.println("size:" + configurableContainer.size()); //打印解析的对象,打印的可能不太清楚 //要想打印格式清晰,与我当初构建xml时相似,过程比较复杂,就不写那么详细了,各位可以自己加断点看对象内容 System.out.println(test); } public static Test createTest(){ //构造一个复杂的Test,没什么特别的,复杂就好。。。 Test t = new Test(); Test t1 = new Test(); Test t2 = new Test(); Test t3 = new Test(); Test t4 = new Test(); Test t5 = new Test(); Test t6 = new Test(); Test t7 = new Test(); Test t8 = new Test(); Test t9 = new Test(); Test t10 = new Test(); List<Test> testList2 = new ArrayList<Test>(); testList2.add(t1); testList2.add(t2); List<Test> testList = new ArrayList<Test>(); t10.testListParam = testList2; testList.add(t10); testList.add(t9); testList.add(t8); testList.add(t7); testList.add(t6); t5.testListParam = testList; t5.testParam = t4; t3.testParam = t5; t.testParam = t3; return t; } public String toString(){ StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("stringParam:" + (stringParam == null? "" : stringParam) + "\r\n") .append("dateParam:" + (dateParam == null ? "" : dateParam) + "\r\n") .append("testParam:" + (testParam == null ? "" : testParam) + "\r\n"); if (testListParam != null) { stringBuffer.append("testListParam:\r\n"); for (Test temp : testListParam) { stringBuffer.append(temp + "\r\n"); } } return stringBuffer.toString(); } public static String read(String fileName) throws IOException{ File file = new File(fileName); FileInputStream fileInputStream = new FileInputStream(file); byte[] bytes = new byte[(int) file.length()]; fileInputStream.read(bytes); return new String(bytes); } public static void write(String fileName,String xml) throws IOException{ OutputStream outputStream = new FileOutputStream(new File(fileName)); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(xml.getBytes()); int len = -1; byte[] bytes = new byte[1024]; while ((len = byteArrayInputStream.read(bytes)) != -1) { outputStream.write(bytes, 0, len); } outputStream.flush(); outputStream.close(); byteArrayInputStream.close(); } }
新建一个java工程,将下载的jar包导入,再直接将测试类代码贴到一个java文件中,运行即可得到E盘下两个xml,一个是不可配置的容器生成的,一个是我们采用可配置容器,调整格式后生成的,可以比对下其中日期格式和xml格式,是不是test2已经被格式化了呢?
由于我们的项目其实只是简单的使用xml和object的互相转换,所以可能其中的很多功能没用到,而平时工作繁忙,我也没时间一一测试,但是各个分部的实现都是模块化拆开的,而且除了xml构建是我自己写的以外,解析采用的JDK的DOMAPI,容器采用的JAVA中collection的方式,多半是已经成熟的底层实现,应该问题不大。