如何使用JAXB Marshall和Unmarshall Map

时间:2014-11-11 18:07:17

标签: java map jaxb

我正在尝试实现一些代码,以便我可以使用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,其中键是寄存器类型,其值是寄存器本身。

我不知道该怎么做。可能吗?我已经尝试使用适配器,但它没有用。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

XmlAdapter上的Map(将Map转换为List Registerregisters个对象的域对象,您将成为能够生成/使用如下所示的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}}