Apache Commons Configuration获取基于父级的属性,其属性等于value

时间:2013-09-14 18:47:14

标签: java xml apache-commons-config

我正在使用Apache Commons Configuration with XML来配置我的应用程序,而且我无法获得我想要的属性。

我有以下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 Configuration库以添加这种类型的功能,但我只是不愿意接受没有更简单的方法来做到这一点

重新讨论的问题

我在忽视什么,以及如何以更简单的方式实现这一目标?这个功能根本不存在吗?

1 个答案:

答案 0 :(得分:1)

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

XMLConfiguration.setDefaultExpressionEngine(new XPathExpressionEngine());

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

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

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

相关问题