1

このような単純なxmlに対して単一のJava Beanでマッピングを行う方法はありますか:

<item lang="en">
   <item-url>some url</item-url>
   <parent id="id_123"/>
</item>

私はこのようなことを試しました:

@XmlRootElement( name = "item" )
public class Item {

    @XmlElement( name = "item-url" )
    private String url;

    @XmlAttribute( name = "parent/@id" )
    // Of course XPath doesn't work here, but it would be great...
    private String parentId;
}

つまり、対応する Bean を作成せずに内部要素の属性にアクセスするにはどうすればよいですか?

4

2 に答える 2

1

を使用できますXmlAdapter

親 ID アダプター

public class ParentIdAdapter extends XmlAdapter<ParentIdAdapter.AdaptedParentId, String> {

    public String unmarshal(AdaptedParentId value) {
        return value.id;
    }

    public AdaptedParentId marshal(String value) {
        AdaptedParentId adapted = new AdaptedParentId();
        adapted.id = value;
        return adapted;
    }

    public static class AdaptedParentId {
        @XmlAttribute
        public String id;
    }

}

アイテム

@XmlRootElement( name = "item" )
public class Item {

    @XmlElement( name = "item-url" )
    private String url;

    @XmlElement( name = "parent" )
    @XmlJavaTypeAdapter(ParentIdAdapter.class)
    private String parentId;
}

EclipseLink MOXyを JAXB プロバイダーとして使用している場合は、@XmlPath拡張機能を利用して次のことを行うことができます。

@XmlRootElement( name = "item" )
public class Item {

    @XmlElement( name = "item-url" )
    private String url;

    @XmlPath("parent/@id")
    private String parentId;
}
于 2012-09-12T17:15:01.610 に答える
0

パッケージに冗長なクラスを作成したくなかったので、私が見つけた最良の解決策は次のとおりです。

@XmlRootElement( name = "item" )
public class Item {

    @XmlRootElement( name = "parent" )
    private static class ParentIdWrapper {
        @XmlAttribute( name = "id" )
        public String id;
    }

    @XmlElement( name = "item-url" )
    private String url;

    @XmlElement( name = "parent" )
    private ParentIdWrapper parentIdWrap;

    public String getParentId() {
        return this.parentIdWrap.id;
    }
}
于 2012-09-12T15:23:00.037 に答える