使用Map 上的XmlAdapter(将Map 转换为具有List 的Register 对象的域对象),您将能够生成/使用看起来像以下(注意添加了registers 元素):
<root attribute1="blabla" attribute2="blablabla">
<registers>
<register type="1" description="blabla">
<field description = "blabla" type = "blabla">
</register>
<register type="2" description="blabla">
<field description = "blabla" type = "blabla">
</register>
</registers>
</root>
如果您使用 EclipseLink MOXy 作为您的 JAXB 提供程序,那么您可以使用我们的 @XmlPath 扩展来摆脱那个额外的元素。
@XmlJavaTypeAdapter(MapAdapter.class) // Standard JAXB annotation
@XmlPath(".") // MOXy extension
private Map<String, Register> registers;
更新
很遗憾,我无法在此项目中使用 MOXy,也无法更改
xml。有没有什么方法可以在没有 registers 标签的情况下解析它?
这不是最漂亮的解决方案,但您可以执行以下操作(注意:使用此解决方案,同时编组 Root 的同一实例是不安全的):
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Root {
private Map<String, Register> registers = new HashMap<String, Register>();
@XmlElement(name="register")
private Collection<Register> registerCollection;
@XmlTransient
public Map<String, Register> getRegisters() {
return registers;
}
public void setRegisters(Map<String, Register> registers) {
this.registers = registers;
}
private void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
for (Register register : registerCollection) {
regusters.put(register.getType());
}
}
private void beforeMarshal(Marshaller marshaller) {
if(null != registers) {
registerCollection = registers.values();
}
}
}