使用JAXB

时间:2016-06-27 12:07:34

标签: java xml jaxb

我有一个XML,其中包含如下序列化的地图:

<system>
  ...
  <entities>
    <entity>
      <string>key<string>
      <string><![CDATA[["a", "b", "c"]]]></string>
    </entity>
    ...
  </entities>
</system>

我希望从中获得的是<entities>被反序列化为Map<String, Object>map.get(key)返回字符串列表。

class System {
  ...
  private Map<String, Object> properties;
}

所以问题是如何让它与JAXB一起使用?

1 个答案:

答案 0 :(得分:2)

您必须使用XmlAdapter和@XmlJavaTypeAdapter注释。

步骤1:创建一个表示<entity>元素的类实体,并将其映射到JAXB。

步骤2:创建一个扩展XmlAdapter<List<Entity>,Map<String,Object>的类,并定义marshall和unmarshall的摘要方法。

第3步:创建一个类实体:

@XmlRootElement
@XmlSeeAlso({Entity.class})
@XmlAccessorType(XmlAccessType.FIELD)
public class Entities{

    @XmlElement(name="entity")
    @XmlJavaTypeAdapter(YourAdapter.class)
    private Map<String,Object> yourMap;

    //getters, setters, and methods
}

然后,当您解组文件时,您将拥有一个包含地图的实体对象。

如果您遇到麻烦,请告诉我,如果此解决方案符合您的需求,那么我可以编辑/追加我的答案。

  

编辑:

如果您的Entities元素不是您的根元素,那么您可以像这样映射它:

class ParentElement{

    //Other fields

    @XmlElement(name="entities")
    private Entities entities;

    //Getters, Setters, Methods
}

并保持实体类

@XmlSeeAlso({Entity.class})
public class Entities{

    @XmlElement(name="entity")
    @XmlJavaTypeAdapter(YourAdapter.class)
    private Map<String,Object> yourMap;

    //getters, setters, and methods
}