【问题标题】:Multiple XML mappings for the same Java object using JAXB?使用 JAXB 为同一个 Java 对象进行多个 XML 映射?
【发布时间】:2010-02-18 21:02:54
【问题描述】:

注意:编辑此内容以围绕 JAXB 重新表述,以期获得新答案。我使用的是 CXF,但它使用 JAXB 进行映射。

我有一个 POJO 模型。现在我通过注释映射它并使用 JAXB 来喷出/读取 XML。然而,这只是一种 XML 格式,我需要根据我正在集成的第 3 方系统将 POJO 模型映射到各种 XML 格式中的一种(例如,各种第 3 方都有“人”的概念,但映射方式不同)。我已经阅读了整个 JAXB 教程,但一切都以注释为中心。是否有一些外部方法来映射类,以便我可以读取/写入多个映射,在其中我选择要在任何给定点使用的映射(即我知道我正在向 Foo Inc. 吐出一个“人”,所以使用 foo 映射)?

编辑:我刚刚发现了一个叫做 JAXBIntroductions 的东西,它可能会完成这项工作。 http://community.jboss.org/wiki/JAXBIntroductions

【问题讨论】:

  • 您需要在 CXF 中使用所有这些 XML 格式吗?
  • 理想情况下,是的 :) 仅仅是因为我已经使用 CXF 为特定的 XML api 映射了我的核心对象。事实证明,尽管我需要能够为新的 XML API 映射这些核心 Java 对象,并且随着时间的推移可能还会映射许多其他对象。所以,如果我可以为所有人使用 CXF,那就太好了。如果没有,那没关系,我会使用任何有效的。

标签: java jaxb


【解决方案1】:

如果您使用的是 EclipseLink JAXB (MOXy),您可以利用外部化映射功能将许多 XML 表示应用于您的 POJO。

此外,由于 MOXy 的映射是基于 XPath 的,您实际上可以将您的 POJO 映射到各种 XML 模式。

【讨论】:

    【解决方案2】:

    您可以为此使用XStream。你可以在没有这样的注释的情况下工作:

    XStream xstream = new XStream();
    XStream xstream = new XStream(new DomDriver());
    xstream.alias("person", Person.class);
    xstream.alias("phonenumber", PhoneNumber.class);
    

    希望对你有帮助

    编辑:为不同的输出创建另一个 XStream 实例

    Person demo = new Person("Chris");
    
    XStream xStream = new XStream();
    xStream.alias("person", Person.class);
    System.out.println(xStream.toXML(demo));
    
    XStream xStream2 = new XStream();
    xStream2.alias("dev", Person.class);
    System.out.println(xStream2.toXML(demo));
    

    输出:

    <person>
      <name>Chris</name>
    </person>
    <dev>
      <name>Chris</name>
    </dev>
    

    【讨论】:

    • XStream 是否允许我自定义它的映射方式?那么,我可以在一个映射中将 Java Person 映射到 ,而在另一个映射中映射到 吗?
    • 是的,你可以,如果你创建另一个 XStream 实例并相应地配置它,我会用一个例子和输出来编辑答案
    • 啊,有趣。我得去看看。我的映射需求将需要相当大的灵活性(例如,一些子 Java 对象可能需要与父级相同的 XML 元素中的值。例如,地址和全名可能是 Java 子级,但在 XML 中它被喷在同一级别或作为属性而不是元素)。
    • MOXy 具有这种类型的支持,有关其基于 XPath 的映射的更多信息,请参阅:bdoughan.blogspot.com/2010/07/xpath-based-mapping.html
    • XStream 具有完全专有的明显缺点。
    【解决方案3】:

    你可以试试http://code.google.com/p/jlibs/wiki/SAX2JavaBinding

    这也是基于注释的。但是您的 POJO 上没有注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      相关资源
      最近更新 更多