5

xml 要素を複数の pojo にアンマーシャリングできるかどうかを調べようとしていました。例えば:

XML の場合:

<type>
  <id>1</id>
  <cost>12</cost>
  <height>15</height>
  <width>13</width>
  <depth>77</depth>
</type>

品目クラス

@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement(name="type")
public class Item {
  private Integer id;
  private Double cost;

  @XmlElement(name="id")
  public Integer getId(){
    return id;
  }

  @XmlElement(name="cost")
  public Double getCost(){
    return cost
  }
}

ItemDimensions クラス

@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement(name="type")
public class ItemDimensions {
  private Integer height;
  private Integer width;
  private Integer depth;

  @XmlElement(name="height")
  public Integer getHeight(){
    return height;
  }

  @XmlElement(name="width")
  public Integer getWidth(){
    return width;
  }

  @XmlElement(name="depth")
  public Integer getDepth(){
    return depth;
  }
}

Netbeans 6.9 によって生成された多数の JAXB マッピングと多数のテスト クラスを使用して同様のことを達成しようとしましたが、うまくいきませんでした。これが中間オブジェクトなしで実行できるものかどうかは誰にもわかりませんか?

4

1 に答える 1

3

EclipseLink JAXB(MOXy)の@XmlPath拡張機能を使用して、このユースケースを実現できます(私はMOXyの技術リーダーです)。

JAXBでは、マーシャリングを解除するために単一のオブジェクトが必要です。この役割を果たすためのクラスを紹介します。このクラスには、自己XPathで注釈を付けてアンマーシャリングする2つのオブジェクトに対応するフィールドがあります:@XmlPath( "。")

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="type")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlPath(".")
    private Item item;

    @XmlPath(".")
    private ItemDimensions itemDimensions;

}

ItemDimensions

通常、このクラスに注釈を付けます。あなたの例では、プロパティに注釈を付けますが、ゲッターのみを提供します。これにより、JAXBはそれらが書き込み専用のマッピングであると見なします。

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class ItemDimensions {

    private Integer height;
    private Integer width;
    private Integer depth;

}

アイテム

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Item {

    private Integer id;
    private Double cost;

}

デモ

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Unmarshaller u = jc.createUnmarshaller();
        Object o = u.unmarshal(new File("input.xml"));

        Marshaller m = jc.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        m.marshal(o, System.out);
    }

}

jaxb.properties

JAXB実装としてMOXyを使用するには、次のエントリを使用して、ドメインオブジェクトにjaxb.propertiesという名前のファイルを指定する必要があります。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
于 2011-04-25T15:32:16.497 に答える