Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB-元素值字段_Java_Xml_Jaxb - Fatal编程技术网

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
了解更多信息


注意:我是专家组的负责人和成员

下面是如何使用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
了解更多信息


下面是使用任何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

下面是使用任何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