在开发过程中经常需要把一些配置文件进行合并。一般情况下这些配置文件都是使用xml格式进行存储的。对配置文件进行合并,说到底就变成了对xml的合并。
有了这样的需求就的好好想想有那些方案了。稍微的想了想(肯定不完整了)合并xml可行方案:
1、使用dom4j、sax等xml解析工具对需要合并的xml代码进行分析、比较并合并。
<<Java中合并XML文档的设计与实现>>(http://fanqiang.chinaunix.net/program/html/2005-06-16/3313.shtml)一文就是采用的这种方式实现了。
2、采用xslt对xml进行合并。
在这两个技术中,我是重点的看了一下第二种。原因是以前对xslt有一点了解,而且不用我自己去控制递规循环这样比较容易出错的环节。
还有就是使用
xslt
有很多很不错的调试环境可以使用如
xmlspy,stylus
studio
等。可以直接看到调试过程。最后有幸在网上看到了一个老外写的一个用于合并
xml
的
xslt
(
http://www2.informatik.hu-berlin.de/~obecker/XSLT/#merge
)。用
xmlspy
跑了一下,当时感觉就是一个“爽”了得。狂喜过后,就开始思考想想如何用
java
实现这个
xslt
的转换过程了。其实这也是一个很简单的过程。使用
dom4j
用下面的代码就可以实现:
public
Document styleDocument(
Document document,
String stylesheet
)
throws
Exception {
//
load the transformer using JAXP
TransformerFactory factory
=
TransformerFactory.newInstance();
Transformer transformer
=
factory.newTransformer(
new
StreamSource( stylesheet )
);
//
now lets style the given document
DocumentSource source
=
new
DocumentSource( document );
DocumentResult result
=
new
DocumentResult();
transformer.transform( source, result );
//
return the transformed document
Document transformedDoc
=
result.getDocument();
return
transformedDoc;
}
就用这样的代码一跑,他居然,居然没有得到我想要的结果。郁闷啊!直接想去找块豆腐,一头撞死算了。但是在死前还是要把这个问题解决掉。要不死也不甘心。简单的分析一下,在xmlspy中可以使用,说明xslt肯定没有问题。那有问题的肯定是xslt
处理器有问题。你有问题我换不就的了吗。最后我换成了如下的情况:
<
dependency
>
<
groupId
>
dom4j
</
groupId
>
<
artifactId
>
dom4j
</
artifactId
>
<
version
>
1.6.1
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
net.sf.saxon
</
groupId
>
<
artifactId
>
saxon
</
artifactId
>
<
version
>
8.5.1
</
version
>
</
dependency
>
</
dependencies
>
重新跑了一下,ok了。没有问题了。
下面的任务就是对这个功能进行简单的封装一下。然需要xml合并的地方能够很容易的调用他。