【问题标题】:JAXB: Make name of xml element transparentJAXB:使 xml 元素的名称透明
【发布时间】:2016-04-29 12:48:18
【问题描述】:

目前我在一个类中有许多不同的 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>

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

@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>

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    应该可以通过使用@XmlValue 注释value 字段的getter 来摆脱额外的值标签。 MOXy 首席开发人员 Blaise Doughan 的 blog post 很好地概述了它的工作原理。

    所以你应该试试这个:

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

    【讨论】:

    • 显然 XmlValue 仅适用于“已知”类型,否则在编组期间会引发 NullPointerException。
    • 啊,我明白了,它不适用于泛型类型。在这种情况下,this 其他答案应该可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2012-06-23
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多