轻松切换
<root>
<child>
<prop1>..</prop1>
<prop2>..</prop2>
</child>
<root>
和
<root>
<child>
<prop1>..</prop1>
<prop2>..</prop2>
<prop3>..</prop3>
<prop4>..</prop4>
</child>
</root>
@XmlRootElement(name= "root")
public class Root {
@XmlElement(name="child")
public Child child
}
@XmlRootElement(name= "root")
public class ExtendedRoot extends Root {
@XmlElement(name="child")
public ExtendedChild child
}
@XmlTransient
public class Child {
// prop1, prop2
}
@XmlType(propOrder = {"prop1", "prop3","prop4", "prop2"})
public class ExtendedChild extends Child {
// prop3, prop4
}
System.setProperty("javax.xml.bind.context.factory", "org.eclipse.persistence.jaxb.JAXBContextFactory")
Class clazz = extendChild ? ExtendedRoot.class : Root.class;
JAXBContext jc = JAXBContext.newInstance(clazz);
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(formattedJob, tempFile);
<root>
<child xs:type="ExtendedChild">
<prop1>..</prop1>
<prop2>..</prop2>
<prop3>..</prop3>
<prop4>..</prop4>
</child>
</root>
如何从
xs:type=...
标签中排除此 child
?
此处使用
xs:type
是因为 child
属性的值是多态的。如果没有它,JAXB 就没有机会决定在读取您自己的 XML 文档时使用哪个类。 JAXB 并不是那么聪明,首先要内省元素,然后选择最合适的类。
但是阅读时还有一些其他的要点:
您是否知道,
ExtendedRoot
有两个名为 child
的属性(继承自 Root
的 super.child 和它自己的 this.child)?由于 ExtendedChild
是 Child
,因此 ExtendedChild
也可以存储到以下两个属性之一:
ExtendedChild
存储到 Root.child
,所以不需要 ExtendedRoot.child
。如果没有这个,本例中甚至不需要 ExtendedRoot
。如果您坚持保留
ExtendedRoot
,请注意,如果 JAXB 遇到 Root
元素,它无法决定是使用 ExtendedRoot
还是使用 root
。