gpt4 book ai didi

java - jaxb java 类到多个 xml 映射

转载 作者:行者123 更新时间:2023-11-30 07:52:59 28 4
gpt4 key购买 nike

我有几个 java 类,我想使用 jaxb 将它们转换为 xml。 (我不需要根据模式生成类)我需要能够将类映射到不同的 xml 格式,所以我不想使用注释。据我所知,最好的选择似乎是使用外部 xml 绑定(bind)。所以我想知道:

1) 我正在使用 Eclipse。我是 JAXB 新手,我想知道如何使用 eclipse 集成外部绑定(bind)?

2) 除了外部 xml 绑定(bind)之外,还有哪些其他选项可用?

最佳答案

我认为最好的选择是使用 MOXy XML 绑定(bind):

这允许您以 XML 文件而不是注释的形式定义 XML<->Java 映射:

<?xml version="1.0" encoding="US-ASCII"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="example">

<java-types>
<java-type name="Customer">
<xml-root-element name="customer-info" />
<java-attributes>
<xml-attribute java-attribute="custId" name="customer-id" />
<xml-element java-attribute="picture" name="picture-hex">
<xml-schema-type name="hexBinary" />
<xml-java-type-adapter
value="example.adapters.MyHexConverter" />
</xml-element>
</java-attributes>
</java-type>
</java-types>

</xml-bindings>

您可以通过 JAXBContextProperties.OXM_METADATA_SOURCE 属性使用此文件:

Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, iStream);

JAXBContext ctx = JAXBContext.newInstance(new Class[] { Customer.class }, properties);

因此,如果您想要同一类有多个不同的映射,只需编写多个 XML 绑定(bind)并使用相应的文件创建 JAXBContext 即可。我认为这是目前最好的选择,MOXy

使用纯 JAXB RI,您可以编写自己的注释阅读器。我用 Annox 做过一次:

另一个选择是 JBoss JAXBIntroductions,也基于自定义注释阅读器:

但我不确定这是否已经生效。

由于您需要多个映射,因此您必须手动编写它们(除了一个)。您可以生成一组映射作为注释,但必须手动编写进一步的映射。或者,比方说,我不知道可以生成 MOXy XML 绑定(bind)等内容的插件或工具。不过,写一个也不是什么大问题。

您也可以采取完全不同的方法。您可以将单独的 DTO 包映射到这些格式,而不是将一个中心模型映射到不同的映射/格式。然后在 DTO 和中心模型之间进行转换。类似的东西

XML(1) <-> DTO(1)|<-\
XML(2) <-> DTO(2)|<--*->Model
XML(3) <-> DTO(3)|<-/

因此,您将拥有每种交换格式的干净 DTO(您可以根据模式生成)和一个中央业务模型(来统治所有这些)。您必须在 DTO 和模型之间进行转换,这可以使用 Dozer 之类的工具来处理。

这是否是一种更好的方法取决于您的格式有多复杂以及它们之间的差异有多大。

关于您的问题:

1) Eclipse 没有什么特别的,只需添加 MOXy 作为依赖项并遵循文档即可。
2) 我在上面描述了一些选项。

关于java - jaxb java 类到多个 xml 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33091678/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com