我有一个类,就是这样:
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
)的类型?
答案 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;
}
}