最近在做xml和bean之间的转换,最开始采用JABX和Digester来处理。这两种方式均有自己的优缺点,分别适用于不同的情景中。
关于如何使用JABX来实现转换请看我的另一篇文章:http://www.52php.cn/article/p-bfaprevi-gm.html
适用Digester来实现请看我的这篇文章:http://www.52php.cn/article/p-ahrnljpy-gm.html
下面来说说这两者的对比。
最开始,师兄拿了一个xml叫我用JABX解析,这个xml大概是10级目录结构,有50个左右的标签,然后最重要的标签的实例列表有800个左右。然后我就找了下JABX的资料,试着解析。
JABX入门很简单,主要是利用注解来实现目录解析,这种方式就是按照xml的目录结构,建好相对应的bean,等建好class类,使用JAXBContext 和 Unmarshaller来解析,用不了超过10行的代码,就可以完成。然后师兄就提出如果不需要解析所有的标签,只解析某一个标签的内容,JABX还是需要建立整个的目录结构,当目录比较庞大,建目录也不是一件容易的事情,因此我打算找找其他方法。
然后就找到了Digester,这种方式基本的也是跟JAXB差不多,建好对应的bean,设计相应的解析规则。但是这种方式不支持注解,所以对于标签的解析就要手动添加对应的路径,对于上面的xml文件,要涉及到50个路径,写的我挺累的,然后Digester就是类似于栈的操作,push一个元素,解析完了再pop,再push下一个元素…直到最后的根目录,其实也比较简单,就是这个目录写的太累了。
然后解析一个相同的xml文件,JABX需要386ms,Digester需要537ms。确实JABX效率要比Digester高很多。但是如果不需要解析所有的标签,只需要解析某一些标签的时候,Digester就非常方便了,因为它的目录是手动配置的,所以不需要建立整个目录对应的bean,只需要建立需要被解析的标签对应的bean,然后手动配置一下路径。就可以非常方便的完成解析。
举例说明
xml文件
<a>
<b>
<c>
<d>
</d>
<e>
</e>
</c>
</b>
</a>
如果只需要解析中的内容,JABX依然需要建立5个bean分别对应于<a>,<b>,<c>,<d>,<e>
。
而采用Digester则只需要2个bean,一个对应于根目录<a>
,一个对应于<e>
。非常简单。
因此JABX和Digester都各有优缺点,总结为,当需要解析的内容比较多,选择JABX会比较高效,而当需要解析的内容只占整个文件的很少部分,则Digester是非常方便省时的。