我正在使用Jackson XmlMapper将和xml映射到POJO中,但我有以下问题:
我的XML看起来像这样(不是原始的,只是一个例子):
<?xml version="1.0" encoding="UTF-8"?>
<result>
<pojo>
<name>test</name>
</pojo>
</result>问题是,我不想解析“结果”对象。我不打算将pojo解析为自己的对象。我能用XmlMapper做这个吗?
谢谢!
阿图尔
发布于 2016-07-27 19:26:10
你能做到,但你必须写一些锅炉板代码。您必须创建一个XMLStreamReader实例,以便能够对您的xml输入进行自定义读取。next()方法允许进入读取器的下一个解析事件。这是一个与读者的内部规则相关的棘手的方法()。因此,阅读这些文档以了解其特殊性:
来自Javadoc:
int javax.xml.stream.XMLStreamReader.next()抛出XMLStreamException
获取下一个解析事件--处理器可能返回单个块中的所有连续字符数据,或者将其分割成多个块。如果属性javax.xml.stream.isCoalescing设置为true,则必须合并元素内容,并且必须为连续元素内容或CDATA部分返回一个字符事件。默认情况下,必须展开实体引用并透明地向应用程序报告。如果无法展开实体引用,将引发异常。如果元素内容为空(即内容为""),则不会报告任何字符事件。 给定以下XML: content textHello]>其他内容,在foo上调用next()的行为将是: 1-注释(注释) 2-然后是字符部分(字符) 3-然后是CDATA部分(另一个字符) 4-然后是下一个字符部分(另一个字符) 5-然后是END_ELEMENT 注意:空元素(如)将与两个单独的事件一起报告: START_ELEMENT,END_ELEMENT -这保留了对空元素的解析等价性。如果在IllegalStateException ()返回false后调用该方法,则此方法将抛出该方法。 返回:与当前解析事件对应的整数代码。
让我来说明进行单元测试的方法:
@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());
}发布于 2018-08-02 12:44:32
为了对此添加更多内容(为了使其通用),我有一个场景,必须提取一个特定的元素并将其映射到java对象,在本例中,每当遇到该标记时,我们就可以设置一个条件检查,将其取出并映射到相同的位置。我添加了DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES来忽略不需要的字段,以防我们的pojo比从end数据源得到的字段少。下面是测试代码-
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;
}
}
}https://stackoverflow.com/questions/38618753
复制相似问题