JAXB(2):可以抑制不需要的列表包装元素

时间:2017-10-04 09:52:02

标签: jaxb jaxb2

对于具有多重性的元素> 1(即..其中maxOccurs> 1或maxOccurs = unbound),例如:

<element name="Name" type="tns:Type" minOccurs="0" maxOccurs="unbound"/>

JAXB生成以下代码:

@XmlElement(name = "Name")
protected List<type> name;

严格地说,上面的架构描述了一个如下所示的XML片段:

<Name attr1="a" attr2="x">
<Name attr1="b" attr2="y">
<Name attr1="c" attr2="z">

即。一系列“名称”元素(只有!)。

当将Java对象编组为XML时,JAXB运行时创建XML,其中包含列表周围的附加包装元素,如下所示:

<Name>
    <Name attr1="a" attr2="x">
    <Name attr1="b" attr2="y">
    <Name attr1="c" attr2="z">
<Name>

默认情况下,包装元素与各个项目具有相同的名称。请注意,没有表示该元素的Java类!

可以通过手动(!)添加一个java-annotation“@XmlElementWrapper”注释,将命名推翻为更有意义的内容,如下所示:

@XmlElementWrapper(name = "NameList")
@XmlElement(name = "Name")
protected List<Type> name;

然后产生以下XML:

<NameList>
    <Name attr1="a" attr2="x">
    <Name attr1="b" attr2="y">
    <Name attr1="c" attr2="z">
<NameList>

我同意这样的包装元素在语法上很好并且使XML更具可读性但是这个存在严重问题:生成的Java代码(有或没有重命名包装元素)会生成并且期望一种XML方言 - 严格来说 - 不再与原始模式匹配!原始模式中没有任何提及任何此类包装元素的隐含概念!

如果在不同的工具中使用原始模式(例如,创建Web表单或不同的基于模式的代码生成器),并且如果他们的结果然后遵循和/或期望原始XML(即,裸序列),则该问题仅浮出水面没有任何包装元素),而JAXB生成的代码创建并坚持存在包装元素。然后两个人无法互相理解!

我的问题是:如何在编组/解组XML时指示JAXB不添加/期望所述包装元素?

我现在已经在网上搜索了很长一段时间来寻找解决方案或解决方案但却一无所获!我无法想象之前没有其他人偶然发现这个问题,除了手动调整XML编组/解组编码之外,似乎没有其他解决方案可以解决这个问题。有任何想法或建议可以解决这个问题吗?

0 个答案:

没有答案