从给定Java对象生成特定XML的最佳实践

从给定Java对象生成特定XML的最佳实践,java,xml,object,Java,Xml,Object,设置 有一个旧的应用程序可以生成PDF格式的报告。它使用XML文档(包含报表数据)和XSLT(描述报表布局)以及ApacheFop生成PDF。此应用程序将被新的应用程序替换 新的应用程序以JavaBean的形式包含报表数据(它们是Hibernate注释的实体)。不再有XML文档了 意图 为了“节省”时间,已经决定XSLT应该保持原样。此外,apachefop库也被再次使用。这就留下了XML文档 其目的是以某种方式获取表示报表数据的Java对象树(hibernate实体),并以给定XSLT仍能理解

设置

有一个旧的应用程序可以生成PDF格式的报告。它使用XML文档(包含报表数据)和XSLT(描述报表布局)以及ApacheFop生成PDF。此应用程序将被新的应用程序替换

新的应用程序以JavaBean的形式包含报表数据(它们是Hibernate注释的实体)。不再有XML文档了

意图

为了“节省”时间,已经决定XSLT应该保持原样。此外,apachefop库也被再次使用。这就留下了XML文档

其目的是以某种方式获取表示报表数据的Java对象树(hibernate实体),并以给定XSLT仍能理解的方式生成XML文档(无需更改XSLT)

建议的解决方案

  • 基于表示报表数据的Hibernate对象树创建第二个对象树。(用JAXB注释对Hibernate注释实体进行注释似乎是错误的。)
  • 使用JAXB 2注释对新的报表数据类进行注释,使它们被封送到一个XML文档中,该文档与XSLT理解的旧XML文档非常相似
  • 问题

    • 建议的解决方案需要花费大量时间编写Java类,或多或少地对预期的XML文档结构进行建模
    问题

    有更好更快的方法吗

    似乎只想“写下”包含在“正确”位置填写的报告数据的XML文档

    可能的解决方案空间非常开放。你会用什么?为什么

    • JAXB 2
    • XMLStreamWriter
    • 棒极了
    • 斯卡拉
    • 还有别的吗
    注意

    • 所需的XML文档没有XML架构或DTD
    • 涉及

    2我想到了解决方案

    一种是使用java.beans.XMLEncoder并创建一个通用的pro处理xslt,将XMLEncoder生成的xml转换为当前的xml数据


    第二种方法是编写自己的xml生成器,可以使用反射(直接或通过java.beans.beandescriptor)使代码通用。

    使用JAXB将文档从POJO转换为xml。然后使用XSLT将XML转换为当前XSLT所期望的格式:JAXBSource->XSLT->XSLT->DOMDRESULT/StreamResult->PDF


    查看有关如何链接多个转换的信息。

    Groovy是构建XML的一种非常简单的方法,值得一试。查看GroovyXMLBuilder特性。仅供参考,使用Groovy(XMLSlurper)读取XML也非常容易。也许有一天知道会很好。@MikeThomas我倾向于同意,因为它朝着“写下XML”的方向发展。例如,使用似乎就是这样。剩下的唯一问题是,将POJO中的数据放到该结构中有多容易(我认为这很容易),以及它对更大的文档的执行情况如何?从POJO构建动态文档比通常的静态示例要复杂一些,但为了避免使用工具,这是一个非常好的解决方案。我们在一个项目中使用Groovy通过HTTP响应格式化简单的XML,它非常适合那些小文档。Slurper也非常适合使用较小的文档。较大的文档可能会让您暂停,因为代码整体可读性可能会降低,在这种情况下,序列化方法可能会更好,正如其他人所提到的。YMMV一如既往。你的答案似乎与@GerritCap的答案相似。他建议不要使用JAXB,而是使用XMLEncoder。想法是一样的,首先用某种结构物化XML,然后应用XSLT转换将其转换为预期的报告数据XML结构。XMLEncoders输出格式不是最容易使用的。此外,您不能将XSLT与XMLEcoderReading@MikeThomas链接最后一条评论我认为我的问题已经得到了回答,我认为您的方法可能是最好的。第一种方法是将POJO转储为XML,然后制定XSLT,将转储的XML转换为所需的XML。好啊(然而,我对编写XSLT并不是特别兴奋,但这只是我个人的观点)。编写自己的XML生成器似乎不是解决这个问题的快速(也是最好的)解决方案。我认为你的第一个答案更好。