使用Java转换XML有哪些不同的方法?

时间:2012-02-27 10:23:57

标签: java xml xslt groovy transformation

我正在研究如何在Java项目中将XML从一种格式转换为另一种格式。

有哪些替代方案,它们的优缺点是什么?

到目前为止我找到的替代品:

  1. XSLT / XQuery的
  2. 将两种格式的XML绑定到Java并使用Java进行映射
  3. Groovy的

4 个答案:

答案 0 :(得分:5)

我投票给XSLT。它具有强大的优势,即转换规则与java代码分离。稍后,您可以轻松地对架构更改做出反应,而无需触及代码。

您可以在任何地方测试/调试转换 - 无需运行应用程序。

答案 1 :(得分:3)

如果您正在将XML转换为XML,那么只有通过非XML表示(例如Java对象)才能为自己做额外的工作。使用高级声明性语言是可行的方法,这意味着XSLT或XQuery。

在XSLT和XQuery之间进行选择时,我通常的建议是XSLT针对转换进行了优化,XQuery针对查询进行了优化。 “转换”是指大多数输入出现在输出中的任务,只是以不同的形式出现。 “查询”是指从大量数据中提取信息块。

当然,所有这些技术都有学习曲线,如果你有一个小的一次性工作要做,那么这可能是选择工具的有效因素。但对于执行XML和Java的项目,最好的建议是尽可能少地使用Java。将其视为“Java项目”可能是一个糟糕的起点。

答案 2 :(得分:0)

我也会说:

  1. SAX可以更简单地实现,因为您的转换非常简单
  2. XSLT,如果您的转换或数据结构很复杂,请使用模式,并且需要一个坚实的基础来实现可维护性
  3. 另一个选项是JDOM,但前提是你有一个简单的,类似对象的数据结构,并且不想使用模式。

答案 3 :(得分:-1)

似乎事实上的标准是XSLT。我个人讨厌XSLT,因为它的冗长和难以阅读和维护。

我更喜欢freemarker,而且我发现java开发人员发现它更容易上手和维护。 Freemarker内置XML support,包括xpath。您可以为常见任务创建自定义freemarker标记,以进一步提高重用性和可读性并减少冗长。

我喜欢freemarker的一个方面是你可以将java助手和服务注入freemarker上下文,你可以调用模板中的方法。例如,这些方法可以命中您的数据库。为了在XSLT中执行此操作,我们将db表转换为XML,然后迭代模板中的XML节点,这些节点效率不高或者是succint。

总之,作为执行相同操作的XSLT模板,freemarker模板可能是代码行的1/3。因为您可以使用java帮助程序,所以可以使用哈希映射和集合等优化查找。最终会得到性能更好的模板,这些模板更易读,更易于维护。

freemarker的XML支持的一个缺点是它是基于DOM的。因此,如果您正在处理大量XML文档,您将获得OutOfMemoryErrors。另一方面,XSLT是基于SAX的。