首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从结构非常不同的Java对象生成XML文档

从结构非常不同的Java对象生成XML文档
EN

Stack Overflow用户
提问于 2012-07-05 19:14:44
回答 4查看 1.9K关注 0票数 5

情况

我在Java中有一个复杂的模型对象图,需要来回转换成XML文档。XML文档模式的对象图结构与模型的对象树非常不同。两者是可互换的,但翻译需要大量的上下文驱动逻辑,其中使用父/子关系。

问题

我正在处理在旧系统中很好地建立的模型对象,而且XML文档的模式是相当新的。由于我们的许多代码依赖于模型对象的结构,所以我们不想对它们进行重构。下面是我正在处理的结构差异类型的简化示例:

示例数据模型树 项目

  • 描述
  • 成本
  • ..。

人物

  • 名字
  • 地址
  • ..。

地址

  • 街道
  • 城市
  • ..。

SaleTransaction (*这是正在翻译的东西)

  • 买方(人)
  • 卖方(人)
  • 出售的商品列表
  • 交换项目列表
  • 交易地点(地址)

示例XML文档结构

交换

  • 类型
  • 各方
    • party_contact_ref
      • 类型
      • contact_id

  • 交换细节
    • 类型
    • total_amount_exchanged

  • 项目
    • 项目
      • 类型
      • owning_party_contact_ref_id
      • exchange_use_type

  • 联系人
    • 联系人
      • id
      • 类型

交换类型:现金销售,易货易货,现金和易货

联系人类型: PERSON =地址

交换详细信息类型:现金交换

SaleTransaction和Exchange之间的映射是可能的,而不是1-1.在示例中,模型中的“买方”将映射到XML文档中的联系人和联系人引用元素。此外,"Item“元素的"owning_party_contact_ref_id”属性的值将通过查看SaleTransaction对象图中的几个不同的值来确定。

如果我正在处理的对象图需要进行一些转换才能在XML文档中使用,那么我的转到工具是XmlAdapter。不过,在这种情况下,我不认为使用JAXB适配器是可行的解决方案,原因有三。

  1. 模型图中的对象对应的XML元素也是与数据相关的。我相信所有到类/属性映射的XmlAdapter都是固定的。
  2. 使用XmlAdapters似乎不可能完成多到一,或一到多的解决方案。MOXy有一个有趣的扩展,但它同样需要对属性的固定映射。
  3. 据我所知,XmlAdapters与单个对象一起工作,并且没有一种方法可以获得正在封送/解编组的整个图的上下文。

问题

我确信这种类型的问题相当常见,那么您如何处理呢?有办法用标准工具来处理这个问题吗?

我想出了什么

如果有趣的话,下面是我提出的一些可能的方法:

#1将对象图转换问题与XML生成问题分开。我有一个自己开发的工具,它可以帮助生成基于上下文对象的对象图。我可以从XML模式创建JAXB类,然后依靠这个工具根据模型对象的上下文生成这些类的对象。这将很好地从模型对象图生成XML文档,而不是反过来。这也意味着依赖非标准的工具,如果可能的话,我想避免这种情况。

#2 . XmlAdapter疯了,修改模型类以便能够保留转换状态信息(例如,模型树中的这个对象用于在XmlAdapter中创建这个元素)。这将使问题与JAXB的标准使用模型非常接近,但我认为开发、测试和维护将是一场噩梦。

#3像我在#1中那样分开对象图问题,但是使用JDOM而不是JAXB。这将删除所有JAXB所需的类和映射,但需要构建另一个自定义工具来管理模型对象到DOM树映射。

我对这三种解决方案中的任何一种都不感到非常兴奋,但我最喜欢的是#1。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-05 20:47:58

1是你最好的选择。编写映射代码是乏味的,但您应该克制住过于聪明的冲动。您使用的任何映射工具都需要配置,我敢打赌,这与手工编写Java映射代码一样多。只需写很多单元测试。

对于任何具有类似命名字段的类,您都可以尝试Dozer,它将使用反射来执行映射。我以前使用过这种方法,但是我的模式看起来更像我的域对象,所以它可能没有多大帮助。

为了使代码更愉快,可以使用JAXB可以找到的所有xjc插件,例如fluent-api和值构造函数插件。

票数 2
EN

Stack Overflow用户

发布于 2012-07-05 20:30:50

如果我正在使用的对象树需要进行一些转换才能在XML文档中使用,那么我的转到工具是XmlAdapter。不过,在这种情况下,我不认为使用JAXB适配器是可行的解决方案。据我所知,XmlAdapters与单个对象一起工作,并且没有一种方法可以获得整棵被封送/解组的树的上下文。

通常,XmlAdapter是无状态的,但是可以在包含状态的Marshaller/Unmarshaller上指定一个实例-- XmlAdapter。这可能就是你所需要的。

代码语言:javascript
复制
YourAdapter yourAdapter = new YourAdapter();
yourAdapter.setState(someState);
marshaller.setAdapter(yourAdapter);
unmarshaller.setAdapter(yourAdapter);

您在Marshaller/Unmarshaller上指定的实例将在配置相应类的地方使用:

代码语言:javascript
复制
@XmlJavaTypeAdpater(YourAdapter.class)

获取更多信息

  • http://blog.bdoughan.com/2011/09/mixing-nesting-and-references-with.html
票数 1
EN

Stack Overflow用户

发布于 2012-07-05 19:29:20

很抱歉,我没有给你一个直截了当的答复,但我还不能评论我的声誉,所以我的“答案”。

我肯定会尝试Altova XML Spy,它是代码生成特性。我试过了,而且非常有用。我不知道它是否能做到相反的工作方式,但由于它也有数据库连通性和其他一些东西,我相信它不会有任何害处,让它尝试和玩它。

他们也有另一个名为MapForce的应用程序(比如在映射数据库中,而不是在地理信息系统中),我从未尝试过,但是从他们那里我会认为它非常有用。

我希望你发现所有这些非常有用,你可以评论这一点,更详细地说明它如何帮助你(或没有)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11351020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档