我正在尝试整理实现公共接口的对象列表。涉及3个类和1个接口:
社区 类(具有一种方法: List getPeople();)
人员 接口(具有一种方法: String getName(); )
女生 班(实施人员)
男生 班(实施人员)
请参见下面的代码。
我想要一个看起来像这样的XML:
<community> <people> <girl> <name>Jane</name> </girl> <boy> <name>John</name> </boy> <girl> <name>Jane</name> </girl> <boy> <name>John</name> </boy> </people> </community>
或可能:
<community> <people> <person> <girl> <name>Jane</name> </girl> </person> <person> <boy> <name>John</name> </boy> </person> </people> </community>
到目前为止,我得到的是:
<community> <people> <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="girl"> <name>Jane</name> </person> <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="boy"> <name>John</name> </person> <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="girl"> <name>Jane</name> </person> <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="boy"> <name>John</name> </person> </people> </community>
我意识到我可以将元素更改为其他名称,但是我希望元素名称成为在Girl或Boy类中特殊化的名称。
能做到吗?谢谢。
@XmlRootElement(name = "community") public class Community { private List<Person> people; @XmlElementWrapper @XmlElement(name="person") public List<Person> getPeople() { return people; } public Community() { people = new ArrayList<Person>(); people.add(new Girl()); people.add(new Boy()); people.add(new Girl()); people.add(new Boy()); } } @XmlRootElement(name = "girl") public class Girl implements Person { @XmlElement public String getName() { return "Jane"; } } @XmlRootElement(name = "boy") public class Boy implements Person { @XmlElement public String getName() { return "John"; } } @XmlJavaTypeAdapter(AnyTypeAdapter.class) public interface Person { public String getName(); } public class AnyTypeAdapter extends XmlAdapter<Object, Object> { @Override public Object marshal(Object v) throws Exception { return v; } @Override public Object unmarshal(Object v) throws Exception { return v; } }
对于这种情况,我建议使用@XmlElements。@XmlElements用于表示选择的XML模式概念:
这是您的示例的外观:
@XmlElements({ @XmlElement(name="girl", type=Girl.class), @XmlElement(name="boy", type=Boy.class) }) @XmlElementWrapper public List<Person> getPeople() { return people; }
@XmlElementRef对应于XML模式中的替换组的概念。这就是为什么上一个答案要求将Person从接口更改为类的原因。