Java Apache Commons配置基于属性等于value的父级获取属性

Java Apache Commons配置基于属性等于value的父级获取属性,java,xml,apache-commons-config,Java,Xml,Apache Commons Config,我正在使用ApacheCommons配置和XML来配置我的应用程序,但在获取所需的属性时遇到了问题 我有以下XML结构(只是为了理解要点而使用的最小结构): 不幸的是,我的应用程序对这些行星的索引没有任何概念。至少,索引不会是一致的。它们随时都可能发生变化,所以像上面那样通过索引引用它们是不可靠的 所以,我想做的是这样的: config.getProperty("planets.planet[@name=mars].terrain"); 你可能已经猜到了,这是行不通的。我发

我正在使用ApacheCommons配置和XML来配置我的应用程序,但在获取所需的属性时遇到了问题

我有以下XML结构(只是为了理解要点而使用的最小结构):

不幸的是,我的应用程序对这些行星的索引没有任何概念。至少,索引不会是一致的。它们随时都可能发生变化,所以像上面那样通过索引引用它们是不可靠的

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

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;
    }
}
List planets=config.getList(“planets.planet[@name]”);
字符串地形=”;
对于(int i=0;i
我相信你会明白为什么这是不可取的。现在,我正考虑包装/扩展ApacheCommons配置库以添加此类功能,但我不愿意接受没有更简单的方法来实现这一点

重提问题
我忽略了什么?如何以更简单的方式实现这一点?这个功能根本不存在吗?

我发现我可以用一个

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

String terrainFile = config.getString("planets/planet[@name='mars']/terrain");
需要注意的一点是,您需要使用ApacheCommonsJXPath库来使用XPathExpressionEngine,否则在尝试创建它时会出现错误

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;
    }
}
XMLConfiguration.setDefaultExpressionEngine(new XPathExpressionEngine());
String terrainFile = config.getString("planets/planet[@name='mars']/terrain");