1

我一直在使用类似于 SnakeYAML 的方法来开发基本的 XMLConfig。

我遇到了 2 个问题:我不知道我要计算出对象的覆盖层路径,而且我不知道如何从路径中读取实际对象(除非我告诉它类型,因为例如一个字符串)。我正在使用 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:所以,我可以得到一个字符串列表,但是我将如何得到对象呢?我有这个方法:

    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;
}

现在我将如何做同样的事情,但返回一个对象列表?很确定我在这里错过了一些东西。

4

0 回答 0