在Java Spring Boot中从XML加载属性的正确方法

时间:2019-04-03 23:01:10

标签: java xml spring-boot xml-parsing

我有一个XML文件,其中存储着国家。每个国家/地区元素都具有区域,子区域,国家/地区代码等属性。我提供的服务应解析XML并根据提供的国家/地区名称获取区域。有没有什么方法可以将XML中的数据加载和使用到内存中,所以我不需要每次都想为国家/地区获取XML时进行解析?我不想使用枚举,因为我想拥有可更新的xml列表,该列表仅在应用程序启动或第一次使用我的服务时被解析一次。因此,在更新XML之后,无需重新构建应用程序即可更新枚举即可重启服务器即可。如何实现?

1 个答案:

答案 0 :(得分:1)

@chrylis提出了这一建议-我碰巧有一个类似的解决方案,可以轻松地将其复制/粘贴到一个有效的示例中。

如果您的XML如下所示:

<countries>
    <country name="England" region="Europe"
        subregion="Western Europe" countryCode="eng" />
    <country name="Scotland" region="Europe"
        subregion="West Europe" countryCode="sco" />
</countries>

因此,您有一个Country类型:

public class Country {
    private String name;
    private String region;
    private String subregion;
    private String countryCode;

    // getters and setters
}

然后将以下依赖项添加到您的项目中:

  • com.fasterxml.jackson.dataformat:jackson-dataformat-xml

这段代码:

public class JacksonXml {
    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
        InputStream is = JacksonXml.class.getResourceAsStream("/countries.xml");

        XmlMapper xmlMapper = new XmlMapper();

        List<Country> countries = xmlMapper.readValue(is, new TypeReference<List<Country>>() {
        });

        Map<String, Country> nameToCountry = countries.stream()
                                                      .collect(Collectors.toMap(Country::getName, Function.identity()));

        System.out.println(nameToCountry.get("England")
                                        .getRegion());
    }

}

将产生产量:

Europe