0

我正在使用带有 XML 的 Apache Commons Configuration 来配置我的应用程序,但在获取我想要的属性时遇到了麻烦。

我有以下 XML 结构(只是为了说明问题的最小结构):

<?xml version="1.0" encoding="UTF-8"?>
<settings>
    <planets>
        <planet name="mars">
            <terrain>terrain/mars.terrain</terrain>
        </planet>
        <planet name="earth">
            <terrain>terrain/earth.terrain</terrain>
        </planet>
    </planets>
</settings>

据我了解,我在这里获得火星terrain设置的最佳方法是:

config.getProperty("planets.planet(0).terrain");

不幸的是,我的应用程序没有/不应该有这些行星索引的任何概念。至少,索引不会是一致的。它们可能随时更改,因此如上所述通过索引引用它们是不可靠的。

所以,我想做的是这样的:

config.getProperty("planets.planet[@name=mars].terrain");

正如您可能已经猜到的那样,这不起作用。我发现这样做的唯一其他方法是迟钝且不可接受的:

List<Object> planets = config.getList("planets.planet[@name]");

String terrain = "";
for (int i = 0; i < planets.size(); i++) {
    if (planets[i].toString().equals("mars")) {
        terrain = config.getString("planets.planet(" + i + ").terrain");
        break;
    }
}

我相信你可以明白为什么这是不可取的。现在,我正在考虑包装/扩展 Apache Commons 配置库以添加此类功能,但我只是不愿意接受没有更简单的方法可以做到这一点.

重新审视问题

我忽略了什么,如何以更简单的方式完成?这个功能根本不存在吗?

4

1 回答 1

1

我发现我可以用XPathExpressionEngine替换 DefaultExpressionEngine 。

XMLConfiguration.setDefaultExpressionEngine(new XPathExpressionEngine());

这允许我使用 XPath 来获取我的属性,我现在可以这样做:

String terrainFile = config.getString("planets/planet[@name='mars']/terrain");

需要注意的一点是,您需要 Apache Commons JXPath 库才能使用 XPathExpressionEngine,否则在尝试创建它时会出错。

于 2013-09-14T19:10:30.777 回答