@XmlElementWrapper将完成此工作:
@XmlElementWrapper(name="Wrapper")@XmlElement(name="Channel")private List<Channel> channels;
对于更高级的情况,可以在Eclipselink JAXB(MOXy)中使用@XmlPath扩展:
- http://bdoughan.blogspot.com/2010/09/xpath-based-mapping-geopre-example.html
这是我到目前为止所拥有的。我仍在尝试消除对辅助对象的需要。该示例需要Eclipselink
JAXB(MOXy)。
模型对象
您的模型对象是:
package example;import java.util.ArrayList;import java.util.List;public class Wrapper { private List<Channel> channels = new ArrayList<Channel>(); public List<Channel> getChannels() { return channels; } public void setChannels(List<Channel> channels) { this.channels = channels; }}和:
package example;import javax.xml.bind.annotation.XmlID;public class Channel { private String id; private String type; private String name; @XmlID public String getId() { return id; } public void setId(String id) { this.id = id; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getName() { return name; } public void setName(String name) { this.name = name; }}辅助对象
我当前的解决方案涉及一些帮助对象:
package example.adapted;import java.util.List;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlElementWrapper;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlTransient;import javax.xml.bind.annotation.XmlType;import example.Channel;import example.Wrapper;@XmlRootElement(name="Output")@XmlType(propOrder={"channels", "channelNames"})public class AdaptedWrapper { private Wrapper wrapper = new Wrapper(); private List<ChannelName> channelNames; @XmlTransient public Wrapper getWrapper() { for(ChannelName channelName : channelNames) { channelName.getChannel().setName(channelName.getName()); } return wrapper; } @XmlElementWrapper(name="Wrapper") @XmlElement(name="Channel") public List<Channel> getChannels() { return wrapper.getChannels(); } public void setChannels(List<Channel> channels) { wrapper.setChannels(channels); } @XmlElementWrapper(name="Wrapper") @XmlElement(name="ChannelName") public List<ChannelName> getChannelNames() { return channelNames; } public void setChannelNames(List<ChannelName> channelNames) { this.channelNames = channelNames; }}和:
package example.adapted;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlIDREF;import example.Channel;public class ChannelName { private String name; private Channel channel; public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlIDREF @XmlElement(name="id") public Channel getChannel() { return channel; } public void setChannel(Channel channel) { this.channel = channel; }}示范代码
package example;import java.io.File;import javax.xml.bind.JAXBContext;import javax.xml.bind.Unmarshaller;import example.adapted.AdaptedWrapper;public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(AdaptedWrapper.class); File xml = new File("input.xml"); Unmarshaller unmarshaller = jc.createUnmarshaller(); AdaptedWrapper adaptedWrapper = (AdaptedWrapper) unmarshaller.unmarshal(xml); Wrapper wrapper = adaptedWrapper.getWrapper(); for(Channel channel : wrapper.getChannels()) { System.out.println(channel.getName()); } }}


