使用JAXB解组具有不同/动态名称的元素

我正在解析具有如下节点的XML文档:

  ... ... ...   ... ... ...   

元素data1,data2,data3始终是一致的。 只有父标签有所不同。 在我的对象模型中,我有一个Object,它代表所有这些情况。 如何在不事先知道元素名称的情况下让JAXB处理这种情况?

@XMLAnyElement匹配所有对象,但不创建适当类型的对象; 我得到一个Node对象列表而不是我的对象。 我的对象目前看起来像:

 public class MyObject { protected String otherData; @XmlAnyElement @XmlElementWrapper(name = "objects") protected List childObjects; } public class MyChildObject { protected String data1; protected String data2; protected String data3; } 

任何想法如何处理这种情况,不能改变传入的XML格式,以使用元素?

如果名称真的是动态的,那么我认为JAXB不会帮助你。 如果您有各种元素名称的定义数量,那么您可以使用inheritance,就像建议的其他post一样。 如果元素和名称的数量未知,我建议使用这样的东西:

 @XmlMixed @XmlAnyElement public List getObjects() { return objects; } 

这会使元素只是一个DOM元素。 然后,您可以再次使用JAXB将每个元素转换为自定义类型。

那就是你必须使用JAXB。 您可能会发现直接将SAX或DOM API用于此类数据会更容易。 JAXB实际上适用于可以表示为模式的定义良好的数据。

您可以使用inheritance:

 @XmlRootElement(name = "dog") public class MyDogObject extends MyChildObject { //nothing here } @XmlRootElement(name = "cat") public class MyCatObject extends MyChildObject { //nothing here } 

这样,它可以让您处理相同的对象类型MyChildObject ,同时灵活地控制XML结构。 另一个好处是,如果您将来定义特定的狗/猫XML节点 – 它们可以映射到相应的子类而不是另一个,如预期的那样。