首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子元素的Jackson XmlMapper映射

子元素的Jackson XmlMapper映射
EN

Stack Overflow用户
提问于 2016-07-27 16:40:03
回答 2查看 1.5K关注 0票数 0

我正在使用Jackson XmlMapper将和xml映射到POJO中,但我有以下问题:

我的XML看起来像这样(不是原始的,只是一个例子):

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <pojo>
        <name>test</name>
    </pojo>
</result>

问题是,我不想解析“结果”对象。我不打算将pojo解析为自己的对象。我能用XmlMapper做这个吗?

谢谢!

阿图尔

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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后调用该方法,则此方法将抛出该方法。 返回:与当前解析事件对应的整数代码。

让我来说明进行单元测试的方法:

代码语言:javascript
复制
@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());
}
票数 2
EN

Stack Overflow用户

发布于 2018-08-02 12:44:32

为了对此添加更多内容(为了使其通用),我有一个场景,必须提取一个特定的元素并将其映射到java对象,在本例中,每当遇到该标记时,我们就可以设置一个条件检查,将其取出并映射到相同的位置。我添加了DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES来忽略不需要的字段,以防我们的pojo比从end数据源得到的字段少。下面是测试代码-

代码语言:javascript
复制
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;
                }
            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38618753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档