7

私はこの状況を持っています

@XmlType(name ="", propOrder={"value"})
@XmlRootElement(name = "compound")
public class Compound extends Value {
  @XmlElements({
  @XmlElement(name="simple", type=Simple.class),
  @XmlElement(name="compound", type=Compound.class)
  })
  protected List<Value> value;
  // ...
}

したがって、複合は単純および/または複合の両方のリストです。どちらも次のように定義された値から拡張されます

public abstract class Value implements Serializable {}

Simple は、単純な文字列との間でマーシャリング/アンマーシャリングするアダプタでマークされたクラスです

@XmlJavaTypeAdapter(SimpleAdapter.class)
public class Simple extends Value {
  private java.lang.String simple;
  // ...
}

コンパウンドはアダプター不要。

問題は、Simple を「そのまま」使用すると、次のように正しくマーシャリング/アンマーシャリングされることです。

<simple>my.text.here</simple>

しかし、コンパウンド内で使用すると、次のような出力が得られます

<compound>
  //...
  <simple>
    <value>my.text.here</value>
  </simple>
  //...
</compound>

そして、私はなぜだろうと思っています...何かが恋しいですか?その「値」を削除するにはどうすればよいですか? @XmlElements 内でマークされたタイプでアダプターを使用することは可能ですか?

編集

いくつかのテストの後、Simple インスタンスの処理方法に問題がある可能性があることがわかりました。したがって、最初の質問を次のように単純化します。

次のような単純なクラスが与えられた場合

@XmlRootElement("simple")
public class Simple {
  private java.lang.String innerText;
  // getters/setters
}

次のようなマーシャリングされた出力を取得するにはどうすればよいですか

<simple>
  my.inner.text.here
</simple>

それ以外の

<simple>
  <value>my.inner.text.here</value>
</simple>

?

4

2 に答える 2

2

private java.lang.String innerText;Simple クラスの @XmlValue になりたいようです。シンプルな文字列に @XmlValue タグで注釈を付けてみてください。

@XmlRootElement("simple")
public class Simple {
  @XmlValue
  private java.lang.String innerText;
  //getters/setters
}

または、ゲッター メソッドで注釈を使用していた場合 (質問の XML 出力に基づいて、 @XmlElement タグを @XmlValue タグに変更すると仮定します。

@XmlValue
public java.lang.String getInnerText() {
  return innerText;
}

これを行うと、編集した質問で探している出力が得られます。

于 2011-05-23T21:47:19.793 に答える
0

bamanaの回答は正しいですが、表示されている例外は JAXB リファレンス実装のバグによるものです。このバグはEclipseLink JAXB (MOXy)にも存在していましたが、2.3.0 ストリームでは修正されています。

回避策として、元の質問にあった XmlAdapter アプローチを使用できます。

シンプルアダプター

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class SimpleAdapter extends XmlAdapter<String, Simple> {

    @Override
    public Simple unmarshal(String v) throws Exception {
        Simple simple = new Simple();
        simple.setSimple(v);
        return simple;
    }

    @Override
    public String marshal(Simple v) throws Exception {
        return v.getSimple();
    }

}

単純

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlJavaTypeAdapter(SimpleAdapter.class)
public class Simple extends Value {
    private java.lang.String simple;

    public java.lang.String getSimple() {
        return simple;
    }

    public void setSimple(java.lang.String simple) {
        this.simple = simple;
    }

}

コンパウンド

import java.util.List;

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "compound")
@XmlAccessorType(XmlAccessType.FIELD)
public class Compound extends Value {
    @XmlElements({ @XmlElement(name = "simple", type = Simple.class),
            @XmlElement(name = "compound", type = Compound.class) })
    protected List<Value> value;

    public List<Value> getValue() {
        return value;
    }

    public void setValue(List<Value> value) {
        this.value = value;
    }

}

価値

import java.io.Serializable;

public abstract class Value implements Serializable {}

デモ

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(Compound.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Compound compound = (Compound) unmarshaller.unmarshal(new File("input.xml"));
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(compound, System.out);
    }

}

入力.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<compound>
    <simple>
        <simple>FOO</simple>
    </simple>
    <compound/>
</compound>
于 2011-05-24T13:37:35.307 に答える