java将多个XML元素添加到同一个类中
我想用JAXB执行以下操作,但不知道如何执行。我将首先向您展示一些代码,然后是详细信息
@XmlRootElement(name = "root")
public class RootClass {
@XmlElementWrapper("foos")
// ?? - I do not want to list here all my xml element
// types with @XmlElements({...})
private List<Foo> fooList;
}
public class Foo {
@XmlTransient
// how to map the element's type (based on the xml element)
// into this attribute?
private FooType type;
@XmlElement(name = "something", type = Something.class)
private Something something;
}
public class Baz extends Foo {
@XmlElement(name = "somethingMore", type = SomethingMore.class)
private SomethingMore more;
}
public enum FooType {
BAR,
QUX
}
以及XML结构:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="mynamespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="myschemalocation">
<foos>
<bar>
<something ... />
</bar>
<qux>
<something ... />
</qux>
<baz>
<something ... />
<somethingMore ... />
</baz>
</foos>
</root>
因此,我有上面的类和XML结构。几乎我所有的Foo-s都几乎相同,但它们在FooType属性上有所不同。但是我的一些Foo-s非常不同:我想为它们创建一个新类(扩展原始Foo)。在本例中,该类称为Baz
有了JAXB,是否可以解组这个结构?在本例的最后,我想得到一个RootClass对象,它有一个包含3个元素的列表:
- 一个Foo对象,其类型为
BAR
- 一个Foo对象,其类型为
QUX
- 和一个
Baz
对象李>
有可能吗,以某种方式使用JAXB?我找了好几个小时了。我试图创建一个带有@XmlRegistry
和@XmlElementDecl
注释的“ObjectFactory”,但我不确定该怎么做
# 1 楼答案
您可以根据以下两种可能性之一使用XML模式。不同之处在于要求有一个混合列表,而不是三个同质列表的序列
首先是混合名单:
这将导致(在类根类型中)出现
其中,JAXBElement允许您提取一个Qname,用于标识元素(基本上是bar/qux/baz的区别)和未编组元素的POJO
另一个变体没有那么凌乱w.r.t.结果API:
这将为您提供非常简单的