3

入力 XML が 2 つの要素のいずれかでラップされる可能性があるという点で、JAXB アンマーシャリングに小さな問題があります。次に例を示します。

<Output>
  <Update>
      <Channel>
          <id>1</id>
      </Channel>
      <Channel>
          <id>2</id>
      </Channel>
  </Update>
</Output>

また

<Output>
  <Erase>
      <Channel>
          <id>1</id>
      </Channel>
  </Erase>
</Output>    

私のルート クラスは@XmlJavaTypeAdapter を使用してチャネルを HashMap にアンマーシャリングしており、以下のコードは期待どおりに動作します。

@XmlRootElement(name="Output")
public class Output{
    @XmlElement(name="Update")
    @XmlJavaTypeAdapter(ChannelAdapter.class)
    private HashMap<Long, Channel> allChannels;
    public Map getChannels() {
        return allChannels;
    }
}

Channelsクラスは次のとおりです。

public class Channels {
    @XmlElement(name="Channel")
    public Channel[] channels;
}

チャネルは次のとおりです。

@XmlAccessorType(XmlAccessType.FIELD)
public class Channel {
    @XmlPath("id/text()")
    private Long id;
}

最後にChannelAdapterは次のとおりです。

public class ChannelAdapter extends XmlAdapter<Channels, Map<Long, Channel>> {
    @Override
    public Map<Long, Channel> unmarshal(Channels value) { ... }

    @Override
    public Channels marshal(Map<Long, Channel> map) { ... }
}

しかし、私は単に置き換えることができると思っ@XmlElement(name="Update")

@XmlElements({
    @XmlElement(name="Update"),
    @XmlElement(name="Erase")
})

しかし、それは空のマップになります。

いずれかの入力 XML ドキュメントをハードコーディングするか、いずれ@XmlElement(name="Update")@XmlElement(name="Erase")で動作しますが、いずれかのラッパー要素で動作するものが必要です。を使用してみましたが、 allChannelsが HashMap であるため機能@XmlElementWrapperしないコレクションまたは配列プロパティでのみ使用できます。

@XmlElements注釈について私が誤解していることと、これを機能させる方法について説明してもらえますか? ありがとう!

4

2 に答える 2

1

私の知る限り、JAXB では双方向のデータ モデルを使用する必要があります。この規則を破らずに、ノードの 2 つの子を 1 つにマージすることはできません。そのため、更新用と消去用の 2 つのリストが必要です。

@XmlElements アノテーションを使用したことがないため、コメントには注意してください。

于 2011-04-05T13:29:15.040 に答える
1

XSD を変更して、XML がいずれかの要素を使用できるが、同時に両方を使用できないようにする選択肢を出力に組み込むようにしてください。

ただし、XmlElements を介してこれに注釈を付ける方法はわかりません。最初に XSD を構築してから、注釈を検索するためのクラスを生成してみてください;)。

于 2012-08-30T11:43:42.590 に答える