将 XML 的内部反序列化为新的 class 实例

Deserialize inner portion of XML into new class instance

给定 XML 以下(简化)格式:

<outer><inner><field1>a</field1><field2>b</field2><field3>c</field3></inner></outer>

我想将 <inner> 元素反序列化为表示该元素的 class 并丢弃其余元素。

public class Inner {
    private String field1;
    private String field2;
    private String field3;
    // getters, setters, ctor
}

我正在使用 Jackson XmlMapper class 来执行反序列化。如果我从 xml 字符串中删除 <outer> 显然它有效。

XmlMapper xmlMapper = new XmlMapper();
// in my scenario the `<inner>` element actually contains fields I don't care about
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Inner inner = xmlMapper.readValue(xml, Inner.class);
System.out.println(inner);
// Inner(field1=a, field2=b, field3=c)

如果我保留 <outer> 元素,inner 中的所有字段都为空。

我试过用 @JacksonXmlRootElement(localName = "inner") 注释 Inner class 但这并没有改变输出。

我可以创建一个 class 来表示 <outer> 元素,但这似乎很浪费。我可能还可以创建一个新字符串,其中仅包含 <inner> 元素之间的 xml,但同样感觉有点老套。

在我的例子中,xml 由我无法控制的单独系统广播,因此我可以简单地修改 xml 结构。

是否可以将 "inner" xml 反序列化为新的 class 实例?

看来 @JacksonXmlRootElement(localName = "inner") 要像您期望的那样工作,您还需要 UNWRAP_ROOT_VALUE。例如

xmlMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);

我不能说上面的内容从文档中很明显。