情况
我在Java中有一个复杂的模型对象图,需要来回转换成XML文档。XML文档模式的对象图结构与模型的对象树非常不同。两者是可互换的,但翻译需要大量的上下文驱动逻辑,其中使用父/子关系。
问题
我正在处理在旧系统中很好地建立的模型对象,而且XML文档的模式是相当新的。由于我们的许多代码依赖于模型对象的结构,所以我们不想对它们进行重构。下面是我正在处理的结构差异类型的简化示例:
示例数据模型树 项目
人物
地址
SaleTransaction (*这是正在翻译的东西)
示例XML文档结构
交换
交换类型:现金销售,易货易货,现金和易货
联系人类型: PERSON =地址
交换详细信息类型:现金交换
SaleTransaction和Exchange之间的映射是可能的,而不是1-1.在示例中,模型中的“买方”将映射到XML文档中的联系人和联系人引用元素。此外,"Item“元素的"owning_party_contact_ref_id”属性的值将通过查看SaleTransaction对象图中的几个不同的值来确定。
如果我正在处理的对象图需要进行一些转换才能在XML文档中使用,那么我的转到工具是XmlAdapter。不过,在这种情况下,我不认为使用JAXB适配器是可行的解决方案,原因有三。
问题
我确信这种类型的问题相当常见,那么您如何处理呢?有办法用标准工具来处理这个问题吗?
我想出了什么
如果有趣的话,下面是我提出的一些可能的方法:
#1将对象图转换问题与XML生成问题分开。我有一个自己开发的工具,它可以帮助生成基于上下文对象的对象图。我可以从XML模式创建JAXB类,然后依靠这个工具根据模型对象的上下文生成这些类的对象。这将很好地从模型对象图生成XML文档,而不是反过来。这也意味着依赖非标准的工具,如果可能的话,我想避免这种情况。
#2 . XmlAdapter疯了,修改模型类以便能够保留转换状态信息(例如,模型树中的这个对象用于在XmlAdapter中创建这个元素)。这将使问题与JAXB的标准使用模型非常接近,但我认为开发、测试和维护将是一场噩梦。
#3像我在#1中那样分开对象图问题,但是使用JDOM而不是JAXB。这将删除所有JAXB所需的类和映射,但需要构建另一个自定义工具来管理模型对象到DOM树映射。
我对这三种解决方案中的任何一种都不感到非常兴奋,但我最喜欢的是#1。
发布于 2012-07-05 20:47:58
1是你最好的选择。编写映射代码是乏味的,但您应该克制住过于聪明的冲动。您使用的任何映射工具都需要配置,我敢打赌,这与手工编写Java映射代码一样多。只需写很多单元测试。
对于任何具有类似命名字段的类,您都可以尝试Dozer,它将使用反射来执行映射。我以前使用过这种方法,但是我的模式看起来更像我的域对象,所以它可能没有多大帮助。
为了使代码更愉快,可以使用JAXB可以找到的所有xjc插件,例如fluent-api和值构造函数插件。
发布于 2012-07-05 20:30:50
如果我正在使用的对象树需要进行一些转换才能在XML文档中使用,那么我的转到工具是XmlAdapter。不过,在这种情况下,我不认为使用JAXB适配器是可行的解决方案。据我所知,XmlAdapters与单个对象一起工作,并且没有一种方法可以获得整棵被封送/解组的树的上下文。
通常,XmlAdapter是无状态的,但是可以在包含状态的Marshaller/Unmarshaller上指定一个实例-- XmlAdapter。这可能就是你所需要的。
YourAdapter yourAdapter = new YourAdapter();
yourAdapter.setState(someState);
marshaller.setAdapter(yourAdapter);
unmarshaller.setAdapter(yourAdapter);您在Marshaller/Unmarshaller上指定的实例将在配置相应类的地方使用:
@XmlJavaTypeAdpater(YourAdapter.class)获取更多信息
发布于 2012-07-05 19:29:20
很抱歉,我没有给你一个直截了当的答复,但我还不能评论我的声誉,所以我的“答案”。
我肯定会尝试Altova XML Spy,它是代码生成特性。我试过了,而且非常有用。我不知道它是否能做到相反的工作方式,但由于它也有数据库连通性和其他一些东西,我相信它不会有任何害处,让它尝试和玩它。
他们也有另一个名为MapForce的应用程序(比如在映射数据库中,而不是在地理信息系统中),我从未尝试过,但是从他们那里我会认为它非常有用。
我希望你发现所有这些非常有用,你可以评论这一点,更详细地说明它如何帮助你(或没有)。
https://stackoverflow.com/questions/11351020
复制相似问题