JAXB:使xml元素的名称透明

时间:2016-04-29 12:48:19

标签: java xml jaxb

目前我在一个类中有许多不同的xml元素包装器。

我想为xml元素的xml标记添加一个属性。 这将作为我的应用程序的标志。

每个xml元素都有不同的属性值,所以我想把它们打包在一起。

出于这个原因,我写了一个有两个字段的新对象。通用值字段和字符串字段,用作属性。

遗憾的是,如果没有“垃圾”xml标记的预先发现,我找不到从值字段中提取值的方法。

有没有办法做到这一点。 为了更清楚,我提出了代码的特定部分。

@XmlRootElement(name = "client")
class Client {
    private List<String> names;

    private List<Integer> salaries;

    private List<Long> socialSecurityNos;

    @XmlElementWrapper(name = "names")
    @XmlElement(name = "name")
    public List<String> getNames() {
        return this.names;
    }

    @XmlElementWrapper(name = "salaries")
    @XmlElement(name = "salary")
    public List<String> getSalaries() {
        return this.salaries;
    }

    @XmlElementWrapper(name = "socialsecuritynos")
    @XmlElement(name = "socialsecurityno")
    public List<String> getSocialSecurityNo() {
        return this.socialSecurityNos;
    }
    ...
    ...
}

这会产生以下xml

<foo>
    <names>
        <name>
            George
        </name>
        <name>
            John
        </name>
    </names>
    <salaries>
        <salaries>
        ...
        ...
        </salaries>
    </salaries>
    <socialSecurityNo>
        <socialSecurityNo>
        ...
        ...
        </socialSecurityNo>
    </socialSecurityNo>
</foo>

我写的新的Value,属性对类。

@XmlRootElement(name = "client")
class GenericElement <T> {
    private String attribute;

    private T value;

    public T getValue() {
        return this.value;
    }

    @XmlAttribute(name = "flag")
    public String getAttribute() {
        return this.attribute;
    }

}

当然我改变了列表类型

@XmlRootElement(name = "client")
class Client {
    private List<GenericElement<String>> names;

    private List<GenericElement<Integer>> salaries;

    private List<GenericElement<Long>> socialSecurityNos;

    ...
    ...

我想得到这个结果。

<foo>
    <names>
        <name flag="on">
            George
        </name>
        ...
        <name flag="off">
            John
        </name>
    </names>

    ....
    .....
        </socialSecurityNo>
    </socialSecurityNo>
</foo>

相反,我得到了“垃圾”值标签。

<foo>
    <names>
        <name flag="on">
            <value>George</value>
        </name>
        ...
        <name flag="off">
            <value>Value</value>
        </name>
    </names>

    ....
    ....    
    ....................</value>
        </socialSecurityNo>
    </socialSecurityNo>
</foo>

1 个答案:

答案 0 :(得分:0)

应该可以通过使用@XmlValuevalue字段添加getter来删除额外值标记。 MOXy首席开发人员Blaise Doughan有一个blog post,可以很好地概述它是如何工作的。

所以你应该试试这个:

@XmlRootElement(name = "client")
class GenericElement <T> {
    ...
    @XmlValue
    public T getValue() {
        return this.value;
    }
    ...
}