我正在尝试使用Jackson 的 XML 注释将 Map 序列化为 XML。我正在将 Map 转换为 List,以便将映射键用作元素名称并将值用作元素值,并且我非常接近获得所需的 XML。
我的课看起来像:
@JacksonXmlRootElement(localName = "request")
public class TrackingEvent {
private List<JAXBElement<String>> data = new ArrayList<JAXBElement<String>>();
public TrackingEvent() {}
public TrackingEvent addData(String key, String value) {
data.add(new JAXBElement<String>(new QName(key), String.class, value));
return this;
}
public Map<String, String> getData() {
Map<String, String> dataAsMap = new HashMap<String, String>(data.size());
for (JAXBElement<String> elem : data) {
dataAsMap.put(elem.getName().getLocalPart(), elem.getValue());
}
return Collections.unmodifiableMap(dataAsMap);
}
}
我的测试代码(quick-n-dirty,不是实际测试):
@RunWith(JUnit4.class)
public class TrackingEventMapperTest {
@Test
public void eventToXml() throws Exception {
TrackingEvent e = new TrackingEvent().addData("eVar17", "woohoo");
XmlMapper mapper = new XmlMapper();
mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
mapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
System.out.println("\n" +
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(e));
}
}
这是它生成的 XML:
<?xml version='1.0' encoding='UTF-8'?>
<request>
<data>
<eVar17>woohoo</eVar17>
</data>
</request>
但我正在寻找的是:
<?xml version='1.0' encoding='UTF-8'?>
<request>
<eVar17>woohoo</eVar17>
</request>
我尝试向数据声明及其 getter 添加 @JacksonXmlElementWrapper(useWrapping = false) 注释,但这似乎无济于事。我可以更改元素的名称,将 @JacksonXmlProperty(localName = "moop") 添加到声明/getter,但无法弄清楚如何完全忽略它。
我很确定我也可以通过阅读杰克逊的文档来使用 JAXB 注释,但也没有通过谷歌找到任何东西。
您可能会猜到,我正在尝试创建一个表示 Omniture 数据的 XML 文档,并尝试以一种我不必将它们显式包含在我的 POJO 中的方式发送所有 eVar 和 prop 变量。
我的解决方案
我决定放弃对 Jackson 的任何使用,因为我需要的 XML 并不复杂,但迫使 Jackson 做我想做的事情变得越来越复杂。我决定使用 STAX2 直接使用 Jackson 在幕后使用的相同实现来编写 XML。这使我可以根据需要自定义 XML。
Blaise 的回答确实似乎完全符合我的要求。