1

我有一堂课,是这样的:

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 知识使我无法弄清楚这一点。任何帮助表示赞赏。

编辑:

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

4

3 回答 3

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)。

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);
    }

}

输入.xml/输出

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

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

了解更多信息

于 2012-12-31T12:35:24.540 回答
3

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

XmlAdapter(双值适配器)

AnXmlAdapter是一种机制,它允许将对象转换为另一种类型的对象。然后是转换为 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);
    }

}

输入.xml/输出

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property>
    <floorArea>
        <value>1.23</value>
    </floorArea>
</property>
于 2012-12-31T12:46:44.090 回答
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;
    }
}
于 2012-12-26T22:26:13.303 回答