我正在尝试实现一些代码,以便我可以使用JAXB对一些xml进行编组和解组。
基本上,我有以下格式的xml:
<root attribute1="blabla" attribute2="blablabla">
<register type="1" description="blabla">
<field description = "blabla" type = "blabla">
</register>
<register type="2" description="blabla">
<field description = "blabla" type = "blabla">
</register>
</root>
我想创建一个HashMap if Registers,其中键是寄存器类型,其值是寄存器本身。
我不知道该怎么做。可能吗?我已经尝试使用适配器,但它没有用。
有人可以帮我吗?
答案 0 :(得分:1)
XmlAdapter
上的Map
(将Map
转换为List
Register
个registers
个对象的域对象,您将成为能够生成/使用如下所示的XML(注意添加<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>
元素):
@XmlPath
如果您使用EclipseLink MOXy作为JAXB提供程序,那么您可以使用我们的@XmlJavaTypeAdapter(MapAdapter.class) // Standard JAXB annotation
@XmlPath(".") // MOXy extension
private Map<String, Register> registers;
扩展来删除该额外元素。
Root
不幸的是,我不能在这个项目中使用MOXy而且我无法改变 XML。有没有任何解析它的方法没有寄存器标记?
这不是最漂亮的解决方案,但您可以执行以下操作(注意:使用此解决方案同时封送同一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();
}
}
}
个实例是不安全的:
{{1}}