[英]Jackson XmlMapper map from child element
我正在使用Jackson XmlMapper映射和xml到POJO,但是我遇到以下问题:
我的XML看起来像这样(不是原始XML,只是一个示例):
<?xml version="1.0" encoding="UTF-8"?>
<result>
<pojo>
<name>test</name>
</pojo>
</result>
问题是,我不想解析“结果”对象。 我不想将pojo解析为自己的对象。 我可以使用XmlMapper吗?
谢谢!
阿图尔
您可以做到,但是必须编写一些样板代码。 您必须创建XMLStreamReader
的实例才能对XML输入进行自定义读取。 next()
方法允许转到读取器的下一个解析事件。 这是一个与读者的内部规则有关的棘手的method()。 因此,请阅读文档以了解特殊性:
从Javadoc:
int javax.xml.stream.XMLStreamReader.next()抛出XMLStreamException
获取下一个解析事件-处理器可以在单个块中返回所有连续的字符数据,也可以将其拆分为几个块。 如果将属性javax.xml.stream.isCoalescing设置为true,则必须合并元素内容,并且对于连续的元素内容或CDATA节,必须仅返回一个CHARACTERS事件。 默认情况下,实体引用必须扩展并透明地报告给应用程序。 如果无法扩展实体引用,则将引发异常。 如果元素内容为空(即内容为“”),则不会报告任何CHARACTERS事件。
给定以下XML:content textHello </ greeting>]]> other content在foo上调用next()的行为将是:1-注释(COMMENT)2-然后是字符部分(CHARACTERS)3-然后是CDATA部分(另一个字符)4-然后是下一个字符部分(另一个字符)5-然后是END_ELEMENT
注意:空元素(如)将通过两个单独的事件进行报告:START_ELEMENT,END_ELEMENT-这保留了将空元素解析为的等效性。 如果在hasNext()返回false之后调用此方法,则将抛出IllegalStateException。
返回:与当前解析事件对应的整数代码
让我说明进行单元测试的方法:
@Test
public void mapXmlToPojo() throws Exception {
XMLInputFactory factory = XMLInputFactory2.newFactory();
InputStream inputFile = MapXmlToPojo.class.getResourceAsStream("pojo.xml");
XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(inputFile);
XmlMapper xmlMapper = new XmlMapper();
xmlStreamReader.next();
xmlStreamReader.next();
Pojo pojo = xmlMapper.readValue(xmlStreamReader, Pojo.class);
Assert.assertEquals("test", pojo.getName());
}
只是为了添加更多信息(为了使这个通用),我不得不提取一个特定元素并将其映射到java对象,在这种情况下,只要遇到该标签,我们就可以进行条件检查和地图一样。 我添加了DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
来忽略不需要的字段,以防我们的pojo映射的字段少于从最终源获取的字段。 以下是经过测试的代码-
while (xmlStreamReader.hasNext()) {
xmlStreamReader.next();
if (xmlStreamReader.nextTag() == XMLEvent.START_ELEMENT) {
QName name = xmlStreamReader.getName();
if (("spcific_name").equalsIgnoreCase(name.getLocalPart())) {
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
result = objectMapper.readValue(xmlStreamReader, Pojo.class);
break;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.