如何在给定元素后反序列化 XML 并获取特定键的值

Posted

技术标签:

【中文标题】如何在给定元素后反序列化 XML 并获取特定键的值【英文标题】:How to deserialize XML and get value of specific key after given element 【发布时间】:2020-03-21 15:35:34 【问题描述】:

我有XML 喜欢:

<campaign>
    <id  type="integer">123</id>
    <name>campaign1</name>
    <description>campaign1</description>
    <flights  type="array">
        <flight>
            <id  type="integer">987</id>
            <name>flight1</name>
        </flight>
        <flight>
            <id  type="integer">3254</id>
            <name>flight2</name>
        </flight>
    </flights>
</campaign>

我想在航班节点下获取数据。我使用的是com.fasterxml.jackson.dataformat2.8.0 版本。

我正在使用代码: 飞行等级

@Getter
@JacksonXmlRootElement(localName = "flight")
public class Flight 
    @JsonProperty("id")
    private String id;
    @JsonProperty("name")
    private String name;

测试类:

ObjectMapper flightMapper = new XmlMapper();
flightMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Flight flight = flightMapper.readValue(xmlString, Flight.class);

但这总是给我广告系列的 ID 和名称。我得到的输出是

id = 123
name = campaign1

我也尝试过使用:

List<Flight> flights = flightMapper.readValue(xmlString, new TypeReference<List<Flight>>() );

但这总是返回null 值。 谁能帮帮我吗?我想用idname 获取List&lt;Flight&gt; 对象。

【问题讨论】:

【参考方案1】:

最简单的解决方案是创建包装类:

class Campaign 
    @JacksonXmlElementWrapper(localName = "flights")
    private List<Flight> flights;

    // getters, setters, toString

之后你可以像下面这样反序列化它:

List<Flight> flights = xmlMapper.readValue(xmlFile, Campaign.class).getFlights();

【讨论】:

这几乎没有改变。刚刚在声明 List 航班 之前添加了“@JacksonXmlElementWrapper(localName = "flights")” @DevSolanki,这有点奇怪。在版本 2.9.9 中,它无需额外注释即可工作。你用的是哪个版本? 我用的是2.8.0版

以上是关于如何在给定元素后反序列化 XML 并获取特定键的值的主要内容,如果未能解决你的问题,请参考以下文章

如何从自定义模型对象数组中获取特定键的值

Hive 查询以获取字符串中给定键的值

解析 XML,获取特定名称的深层元素。 (C#)

如何按给定键的值对关联数组进行排序并在php中维护键? [复制]

如何从动态对象中获取反序列化的 xml 属性

Groovy - 如何在不更新地图的情况下使用默认值获取地图值