JAXB - 元素值字段

时间:2012-12-26 20:34:59

标签: 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)的类型?

3 个答案:

答案 0 :(得分:3)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

以下是使用MOXy @XmlPath扩展程序映射用例的方法:

<强>属性

package forum14045961;

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
public class Property {

    private double floorArea;

    public double getFloorArea() {
        return floorArea;
    }

    @XmlPath("floorArea/value/text()")
    public void setFloorArea(double floorArea) {
        this.floorArea = floorArea;
    }

}

<强> jaxb.properties

要将MOXy指定为JAXB(JSR-222)提供程序,您需要在与域模型相同的包中包含名为jaxb.properties的文件,并带有以下条目(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。< / p>

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

<强>演示

当MOXy用作JAXB提供程序时,只需要标准的JAXB运行时API来读取对象并将它们写回XML。

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"?>
<property>
   <floorArea>
      <value>1.23</value>
   </floorArea>
</property>

了解更多信息

答案 1 :(得分:3)

以下是使用任何JAXB(JSR-222)实现XmlAdapter支持您的用例的方法。

XmlAdapter(DoubleValueAdapter)

XmlAdapter是一种允许将对象转换为其他类型对象的机制。然后是转换为/从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;
    }

}

<强>属性

@XmlJavaTypeAdapter注释用于指定XmlAdapter。我需要将double更改为Double,因此我将映射移至字段,以免影响公共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>

答案 2 :(得分:2)

您的预感是正确的,按照您所显示的方式生成xml。

public class Property {

    @XmlElement(required = true)
    protected FloorArea floorArea;
    public FloorArea getFloorArea() {
        return floorArea;
    }
    public void setFloorArea(FloorArea value) {
        this.floorArea = value;
    }
}

您的FloorArea类看起来就像下面的代码快照。

public class FloorArea {

    @XmlElement(required = true)
    protected String value;
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}