我一直在使用类似于SnakeYAML的基本XMLConfig。
我遇到了两个问题:我不知道我会找出对象的覆盖层路径,我不知道如何从路径中读取实际对象(除非我告诉它type,例如String)。 我正在使用DOM来解析我的配置文件。
问题1: 好的,所以我得到了这样的东西:
public String getString(String string, String def) { return getRootElement().getElementsByTagName(string).item(0) == null || getRootElement().getElementsByTagName(string).item(0).getTextContent().equalsIgnoreCase("") ? def : getRootElement().getElementsByTagName(string).item(0).getTextContent(); }
这是有效的(除非它没有,然后即使我做了检查,我得到了一个NPE?),但它只适用于1层(如果这是正确的术语)。
示例:
<root>
<somestring>hello!</somestring></root>
我可以使用getString(“somestring”,null)来获取somestring的值。
但是,如果是这样的话:
<root>
<somestrings>
<string>Hey!</string>
<string2>Hola!</string>
</somestrings>
我无法获取字符串或字符串2,除非我获得节点列表,将其转换为字符串列表,然后得到我想要的。我想以某种方式返回一个字符串列表,只是添加所有结果,这很容易,但路径呢?我怎么知道循环孩子多少次?我需要一些方法来做getString(“somestrings.string”,null)。
问题2: 所以,我可以获得一个String列表,但是如何获得该对象? 我有这个方法:
public List<String> getStringList(String string) {
return XMLUtils.NodeListToStringList(getRootElement().getElementsByTagName(string));
}
XMLUtils.NodeListToStringList()是:
public static List<String> NodeListToStringList(NodeList n) {
List<String> toReturn = Lists.newArrayList();
if (n == null) return toReturn;
for (int i = 0; i < n.getLength(); i++) {
toReturn.add(n.item(i).getTextContent());
}
return toReturn;
}
现在我将如何做同样的事情,但返回一个对象列表? 很确定我错过了这里的一些东西。