使用JAXB

时间:2018-11-29 09:52:20

标签: java xml jaxb

我正在尝试将对象编组为XML,该对象扩展了HashMap<String, List<String>>。但是,对于输出为何不包含在此对象中输入的数据的原因,我仍然不清楚。问题的结尾附近可以找到用于将该对象编组为XML的方法。

示例1(实际情况)

数据结构:

@XmlRootElement
class WhatIWant extends HashMap<String, List<String>> {

}

使用以下方式填充

WhatIWant what = new WhatIWant();
what.put("theKey", Arrays.asList("value1", "value2"));

结果输出如下,找不到输入的数据。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<whatIWant/>

示例2(产生预期结果的情况)

类似的事情确实可行,这正是我期望第一个示例的输出看起来类似的东西。

数据结构:

@XmlRootElement
class MyHashmap {
    public HashMap<String, MyList> map = new HashMap<>();
}

class MyList {
    public List<String> list = new ArrayList<String>();
}

填充使用:

MyHashmap requirement = new MyHashmap();
MyList t = new MyList();
t.list = Arrays.asList("value1", "value2");
requirement.map.put("theKey", t);

结果输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myHashmap>
    <map>
        <entry>
            <key>theKey</key>
            <value>
                <list>value1</list>
                <list>value2</list>
            </value>
        </entry>
    </map>
</myHashmap>

对象为XML方法

我用来将对象转换为XML的方法:

public static String getObjectAsXML(Object obj) {
    try {
        // Create marshaller
        JAXBContext context = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        // Marshall the object
        StringWriter sw = new StringWriter();
        marshaller.marshal(obj, sw);

        return sw.toString();
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

问题

  1. 为什么Example 1不能生成与Example 2中的输出类似的输出?为什么根本不产生任何东西?
  2. 如何为Example 1之类的结构获取XML输出?还是不可能?

1 个答案:

答案 0 :(得分:1)

原因可能是由于以下原因: 要编组/解组的元素必须是公共的,或具有XMLElement批注。

在您的第一个示例中,根类没有公共元素,而第二个类却没有公共元素。您可以尝试(在第一个示例中)添加一个公共吸气剂,以返回地图条目(并将适当的@XmlAccessorType添加到WhatIWant类中),看看它是否给出了预期的结果