java - JAXB - 元素值字段

标签 java xml jaxb

我有一个类,是这样的:

public class Property {

    private double floorArea;

    public double getFloorArea() {
        return floorArea;
    }

    @XmlElement
    public void setFloorArea(double floorArea) {
        this.floorArea = floorArea;
    }

}

这会给我这样的东西:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property>
    <floorArea>x</floorArea>
</property>

但是我需要这样的东西:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property>
    <floorArea>
        <value>x</value>
    </floorArea>
</property>

我使用的 API 需要这样。我有限的 JAXB 知识使我无法弄清楚这一点。感谢您的帮助。

编辑:

我正在研究的东西。我是否需要创建一个带有自己的 JAXB 注释的 value 类才能工作? (并将 floorArea 设置为 value 的类型)?

最佳答案

下面是如何通过使用任何 JAXB (JSR-222) 实现的 XmlAdapter 来支持您的用例。

XmlAdapter (DoubleValueAdapter)

XmlAdapter 是一种允许将对象转换为另一种类型的对象的机制。然后是转换为 XML 或从 XML 转换的转换对象。

package forum14045961;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DoubleValueAdapter extends XmlAdapter<DoubleValueAdapter.AdaptedDoubleValue, Double>{

    public static class AdaptedDoubleValue {
        public double value;
    }

    @Override
    public AdaptedDoubleValue marshal(Double value) throws Exception {
        AdaptedDoubleValue adaptedDoubleValue = new AdaptedDoubleValue();
        adaptedDoubleValue.value = value;
        return adaptedDoubleValue;
    }

    @Override
    public Double unmarshal(AdaptedDoubleValue adaptedDoubleValue) throws Exception {
        return adaptedDoubleValue.value;
    }

}

属性(property)

@XmlJavaTypeAdapter 注释用于指定XmlAdapter。我需要将 double 更改为 Double,因此我将映射移至该字段,以免影响公共(public) API。

package forum14045961;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Property {

    @XmlJavaTypeAdapter(DoubleValueAdapter.class)
    private Double floorArea;

    public double getFloorArea() {
        return floorArea;
    }

    public void setFloorArea(double floorArea) {
        this.floorArea = floorArea;
    }

}

演示

下面是一些演示代码来证明一切正常。

package forum14045961;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Property.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14045961/input.xml");
        Property property = (Property) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(property, System.out);
    }

}

input.xml/输出

下面是演示代码的输入和输出。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property>
    <floorArea>
        <value>1.23</value>
    </floorArea>
</property>

关于java - JAXB - 元素值字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14045961/

相关文章:

java - 创建大小为 n 的 boolean 数组的所有可能方式?

java - Maven - 在依赖项中使用版本

Java - 如何测试永远不会发生的异常?

php - Javascript 和 PHP5 中的换行符

c# - 在不知道确切结构的情况下计算大量嵌套的 XmlNodes

java - 如何解决第三方 XML 架构冲突?

java - JAXB 测试手工制作的 bean

java - 为什么不保留新实体?

xml - XML 中的换行符无效吗?

java - PowerMock 不能与 JAXB Unmarshal 一起使用