如果我正确理解问题,您希望将 XML 配置解组为 Map,其中 User 具有任意字段。
您的配置文件缺少地图节点的关闭。
获得以下格式后,您将能够轻松地自动化解码过程:
<Config>
<map name="student1">
<value key="name">abc</value>
<value key="age">12</value>
<value key="gender">male</value>
</map>
<map name="student2">
<value key="name">xyz</value>
<value key="age">15</value>
<value key="gender">female</value>
</map>
</Config>
您可以使用 javax.xm.parsers 解决方案创建自定义编组器:
try {
final File configFile = Paths.get("C:/Development/file.xml").toFile();
final DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
final DocumentBuilder dBuilder;
dBuilder = dbFactory.newDocumentBuilder();
final Document doc = dBuilder.parse(configFile);
final NodeList nodeList = doc.getChildNodes();
if (nodeList.getLength() == 0) {
throw new IllegalArgumentException("Config is empty or incorrect.");
}
final NodeList elements = nodeList.item(0).getChildNodes();
final Map<String, User> users = new HashMap<>();
for (int i = 0; i < elements.getLength(); i++) {
final Node item = elements.item(i);
if (!"map".equals(item.getNodeName())) {
continue;
}
final String key = item.getAttributes().getNamedItem("name").getNodeValue();
final NodeList childNodes = item.getChildNodes();
String name;
String age;
String gender;
for (int j = 0; j < childNodes.getLength(); j++) {
final Node childItem = childNodes.item(j);
if (!"value".equals(childItem.getNodeName())) {
continue;
}
final String fieldName = childItem.getAttributes().getNamedItem("key").getNodeValue();
final String fieldValue = childItem.getNodeValue();
switch (fieldName) {
case "name":
name = childItem.getNodeValue();
break;
case "age":
age = childItem.getNodeValue();
break;
case "gender":
gender = childItem.getNodeValue();
break;
default:
throw new IllegalArgumentException(String.format("Unknown user field %s", fieldName));
}
}
users.put(key, new User(name, age, gender));
}
} catch (final ParserConfigurationException | SAXException | IOException e) {
throw new IllegalArgumentException("Error during config parsing");
}
编辑:
由于主帖下的cmets以及我无法在那里写,我将在这里写:
配置属性文件是一种常用的键值对序列化成文件的结构,如下例:
property.name=value
other.property.name=value
XML 文件也是一种数据结构形式,尽管 XML 文件的可能性更广泛,并提供更多的数据灵活性以及对象序列化。您的配置可以存储为属性格式、XML、JSON 等。但是您的数据类型表明使用比属性更复杂的数据存储结构