繁体   English   中英

来自子元素的Jackson XmlMapper映射

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM