2

次のXML構造が与えられます。

<root>
  <data>x</data>
  <details>
    <some_other_element>...</some_other_element>
    <collection>
      <element><a>1</a></element>
      <element><a>2</a></element>
      <element><a>3</a></element>
    <collection>
  </details>
</root>

MOXyを使用して、これをほぼフラットなPOJOにマーシャリングするにはどうすればよいですか?私はこのアプローチを試しました(簡潔にするためにゲッターとセッターは省略しました):

@XmlRootElement(name = "root")
class Root {
  @XmlElement
  private String data;

  @XmlElement
  @XmlPath("details/some_other_element")
  private String someOtherElement;

  @XmlPath("details")
  @XmlElementWrapper(name = "collection")
  @XmlElement(name = "element")
  private Collection<Element> elements;
}

class Element {
  @XmlElement
  private String a;
}

残念ながら、これは初期化されていない単一のelementsコレクションを追加するだけです。以下の要素Detailsの他のマッピングを壊すので、クラスを宣言する必要はありません(実際に機能します) 。@XmlPath<details>

MOXyが実際にロードされていることを確認しました(jaxb.propertiesで宣言されているとおり)。

何か案は?

4

1 に答える 1

3

@XmlPathを使用する代わりに、ラッピングタグと要素を追加してみてください@XmlElementWrapper

@XmlPath("details/collection/element")
@XmlElement(name = "element")
private Collection<Element> elements;

@XmlElementWrapper将来jaxbプロバイダーが変更された場合に備えて、アノテーションを保持することもできると思います。


以下は、ユースケースに必要な最小限のアノテーションです。

package forum11153599;

import java.util.Collection;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
class Root {
    @XmlElement
    private String data;

    @XmlPath("details/some_other_element/text()")
    private String someOtherElement;

    @XmlPath("details/collection/element")
    private Collection<Element> elements;

}
于 2012-06-22T09:53:51.200 に答える