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 アノテーションを持つクラスを作成する必要がありますか? (そしてfloorAreaのタイプに設定value)?

4

3 に答える 3

3

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

@XmlPath以下は、MOXy の拡張機能を使用してユース ケースをマッピングする方法です。

財産

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 プロバイダーとして使用されている場合、オブジェクトを XML から読み取り、XML に書き戻すには、標準の JAXB ランタイム API のみが必要です。

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>

詳細については

于 2012-12-31T12:35:24.540 に答える
3

XmlAdapter以下は、JAXB (JSR-222) 実装を使用してユースケースをサポートする方法です。

XmlAdapter (DoubleValueAdapter)

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

}

input.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 に答える