XmlMapper:读取 XML 值而不为创建的对象分配 class

XmlMapper: read XML values without assigning a class for the created objects

我正在尝试为我的项目实现多语言界面,为此我想从 XML 文件中加载 3 种语言的数据。问题是,当我想读取值时,我只能使用 readValue(file,MyClass.class) 来完成,我不想这样做,因为我想直接将数据提取到设置并迭代它,而不是进入一个对象。 例如,在 XML 文件中,我想直接提取带有“english”的字段,然后遍历其值。我可以对“罗马尼亚语”或“德语”做同样的事情。我发现为每个 window 创建一个新的 class 是没有用的...有没有办法直接提取每种语言并迭代其元素?

这是我的 XML 代码:

<?xml version="1.0" encoding="utf-8"?>
<langauges>
  <romanian>
    <flight_number>Numar zbor:</flight_number>
    <depart_airport>Aeroport plecare:</depart_airport>
    <destination>Destinatie:</destination>
    <flight_time>Timpul de zbor:</flight_time>
    <username>Utilizator:</username>
    <password>Parola:</password>
    <login>Log In</login>
    <search_depart_destination_time>Cautare dupa aeroport de plecare/destinatie si timp</search_depart_destination_time>
    <see_price_free_seats_2_locations>Vezi preturi si locuri libere intre 2 locatii</see_price_free_seats_2_locations>
    <search_after_flight_number>Cauta dupa numarul zborului</search_after_flight_number>
  </romanian>
  <english>
    <flight_number>Flight number:</flight_number>
    <depart_airport>Depart airport:</depart_airport>
    <destination>Destination:</destination>
    <flight_time>Flight time:</flight_time>
    <username>Username:</username>
    <password>Password:</password>
    <login>Log In</login>
    <search_depart_destination_time>Search after depart/destination airport and time</search_depart_destination_time>
    <see_price_free_seats_2_locations>See price and free seats between 2 locations</see_price_free_seats_2_locations>
    <search_after_flight_number>Search after flight number</search_after_flight_number>
  </english>
  <german>
    <flight_number>Flug Nummer:</flight_number>
    <depart_airport>Abflug flughafen:</depart_airport>
    <destination>Bestimmungsort:</destination>
    <flight_time>Flugzeit:</flight_time>
    <username>Nutzername:</username>
    <password>Passwort:</password>
    <login>Anmeldung</login>
    <search_depart_destination_time>Suchen zwischen abflug/bestimmungsort und zeit</search_depart_destination_time>
    <see_price_free_seats_2_locations>Sehen preis und frei plaetze zwischen 2 oerten</see_price_free_seats_2_locations>
    <search_after_flight_number>Suchen ueber Flug nummer</search_after_flight_number>
  </german>
</langauges>

这里,我做的Java方法不成功:

XmlMapper xmlMapper = new XmlMapper();
File file = new File("languages.xml");
String xml = Files.readString(file.toPath());
String s =  xmlMapper.readValue(xml, String.class);

我认为您可能想要一个可动态更改的可迭代结构,而无需更改您的 class。在这种情况下,我建议使用地图。

Map<String, Map<String, String>>xmlMap = xmlMapper.readValue(xml, new TypeReference<Map<String, Map<String, String>>>() {});

或者干脆

Map<String, Map<String, String>>xmlMap = xmlMapper.readValue(xml, Map.class);

但我更喜欢前一个,因为它更干净。 然后你可以这样称呼他们

String password = xmlMap.get("german").get("password");
System.out.println(password);

在 JavaScript 等其他编程语言中,对象只是一张地图,可以毫不费力地动态更改。

我正在考虑的一个场景是有一个包含语言的下拉菜单,在你选择它之后,你可以遍历该语言中的元素,也许你有一种语言需要更多或更少的字段,在这种情况下,Map是一个不错的选择。

希望对您有所帮助!