5

ネストされた要素を同じ Java クラスにマップしようとすると問題が発生します。

XML

ここでやろうとしているのは、id属性とtext要素をSlideTextクラスに設定することです。

<module name="test project">
    <slide id="1">
        <layout>
            <text>hello</text>
        </layout>
    </slide>
</module>

モジュールクラス

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Module {
    @XmlAttribute
    private String  name;

    @XmlElements({
        @XmlElement(name = "slide", type = SlideText.class)
    })
    private Slide   slide;
}

スライドクラス

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class Slide {
    @XmlAttribute
    private String  id;
}

SlideText クラス

@XmlElementWrapperonプロパティを使用しようとしましたが、コレクションにのみ適用できるtext例外が発生します。@XmlElementWrapper

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class SlideText extends Slide {

    // how to map this to layout/text elements?
    private String  text;
}

のプロパティにマップ<layout><text>hello</text></layout>する方法はありますか?SlideTexttext

ありがとう。

アップデート

ここで何を達成しようとしているのかを説明するために、使用するレイアウトに応じてスライドを任意のタイプにすることができます。Aはそれが A であることはmodule知ってslideいますが、それがどのスライドであるかはわかりません。そのため、抽象Slideクラスを使用しています。

基本的に、これが機能する場合は、作成SlideImageSlideTextVideo、拡張しSlideます。

実際の XML ファイルは次のようになります。

<module name="test project">
    <slide id="1">
        <layout-text>
            <text>hello</text>
        </layout-text>
    </slide>
</module>
<module name="test project">
    <slide id="2">
        <layout-image>
            <image-path>img.jpg</image-path>
        </layout-image>
    </slide>
</module>
<module name="test project">
    <slide id="3">
        <layout-text-video>
            <text>hello</text>
            <video-path>a.mp4</video-path>
        </layout-text-video>
    </slide>
</module>
4

2 に答える 2

3

EclipseLink JAXB (MOXy)を使用している場合は、これに @XmlPath 拡張機能を利用できます (私は MOXy 技術リーダーです)。

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
@XmlAccessorType(XmlAccessType.FIELD)
public class SlideText extends Slide {

    @XmlPath("layout/text/text()")
    private String  text;

}

標準の JAXB を使用すると、XmlAdapter を利用できます。

于 2011-02-03T18:25:57.803 に答える
0

新しいクラスを追加しLayoutます:

public class SlideText extends Slide {
    @XmlElement
    private Layout layout;
}

public class Layout {
    @XmlAttribute
    private String  text;
}
于 2011-02-03T18:17:41.420 に答える