Java JAXB-元素值字段
我有一门课,是这样的:Java JAXB-元素值字段,java,xml,jaxb,Java,Xml,Jaxb,我有一门课,是这样的: public class Property { private double floorArea; public double getFloorArea() { return floorArea; } @XmlElement public void setFloorArea(double floorArea) { this.floorArea = floorArea; } } <
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>
这会给我类似的东西:
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>
x
但我需要这样的东西:
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>
x
我使用的API要求这样做。我有限的JAXB知识使我无法理解这一点。感谢您的帮助
编辑:
我正在研究的东西。我是否需要创建一个带有自己JAXB注释的
value
类才能工作?(并将floorrarea
设置为value
)类型?您的直觉是正确的,所述方法将生成您所显示的xml
public class Property {
@XmlElement(required = true)
protected FloorArea floorArea;
public FloorArea getFloorArea() {
return floorArea;
}
public void setFloorArea(FloorArea value) {
this.floorArea = value;
}
}
您的Floorrarea类看起来像下面的代码快照
public class FloorArea {
@XmlElement(required = true)
protected String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
您的直觉是正确的,所描述的方法将生成您所显示的xml
public class Property {
@XmlElement(required = true)
protected FloorArea floorArea;
public FloorArea getFloorArea() {
return floorArea;
}
public void setFloorArea(FloorArea value) {
this.floorArea = value;
}
}
您的Floorrarea类看起来像下面的代码快照
public class FloorArea {
@XmlElement(required = true)
protected String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
注意:我是专家组的负责人和成员 下面是如何使用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
的文件,其中包含以下条目(请参阅:)
演示
当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/Output
下面是运行演示代码的输入和输出
1.23
了解更多信息
@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
的文件,其中包含以下条目(请参阅:)
演示
当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/Output
下面是运行演示代码的输入和输出
1.23
了解更多信息
XmlAdapter
如何支持您的用例
XmlAdapter(DoubleValueAdapter)
XmlAdapter
是一种允许将对象转换为其他类型对象的机制。然后是转换为XML或从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;
}
}
演示
下面是一些演示代码,以证明一切正常
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/Output
下面是演示代码的输入和输出
1.23
下面是使用任何JAXB(JSR-222)实现的XmlAdapter
如何支持您的用例
XmlAdapter(DoubleValueAdapter)
XmlAdapter
是一种允许将对象转换为其他类型对象的机制。然后是转换为XML或从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;
}
}
演示
下面是一些演示代码,以证明一切正常
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/Output
下面是演示代码的输入和输出
1.23
@BlaiseDoughan的可能重复:在这种情况下,我认为与解决前面问题的方法的联系对于本OP来说不会像对您那样清晰。由于这里的重点是向发出的XML添加嵌套级别,而不是捕获重复元素的好方法,因此我认为这是一种近似重复的方法,而不是精确的方法。jsn的编辑建议在正确的方向上取得进展,我相信会得到一些鼓励@hardmath-我现在为这个问题添加了一个答案,这个答案应该会有所帮助:@BlaiseDoughan:+1正如所有这些详细的答案一样,这些好处将在OP解决问题后很长一段时间内传递给读者。谢谢你抽出时间!@BlaiseDoughan的可能复制品:在这种情况下,我认为与解决前面问题的方法之间的联系对于这个OP来说并不像对你那么清楚。由于这里的重点是向发出的XML添加嵌套级别,而不是捕获重复元素的好方法,因此我认为这是一种近似重复的方法,而不是精确的方法。jsn的编辑建议在正确的方向上取得进展,我相信会得到一些鼓励@hardmath-我现在为这个问题添加了一个答案,这个答案应该会有所帮助:@BlaiseDoughan:+1正如所有这些详细的答案一样,这些好处将在OP解决问题后很长一段时间内传递给读者。谢谢你抽出时间!这是一个解决办法。但是没有成功。我编写了自己的JAXB轻量级版本。谢谢。@jsn-我已经添加了两个答案。第一个问题是如何将这个答案中的想法隐藏在XmlAdapter
后面(请参阅:)。第二种方法利用EclipseLink JAXB(MOXy)(参见:)中的@XmlPath
扩展,这是一种解决方案。但是没有成功。我编写了自己的JAXB轻量级版本。谢谢。@jsn-我已经添加了两个答案。第一个问题是如何将这个答案中的想法隐藏在XmlAdapter
后面(请参阅:)。第二个利用了EclipseLink JAXB(MOXy)中的@XmlPath
扩展(请参见:)我实际上查看了MOXy并尝试使用它,但与原始JAXB库相比,该库非常大(在大小上)。谢谢你的回答@jsn-我们目前正在重构MOXy