我正在使用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库以添加这种类型的功能,但我只是不愿意接受没有更简单的方法来做到这一点
我在忽视什么,以及如何以更简单的方式实现这一目标?这个功能根本不存在吗?
答案 0 :(得分:1)
我发现我可以用XPathExpressionEngine替换DefaultExpressionEngine。
XMLConfiguration.setDefaultExpressionEngine(new XPathExpressionEngine());
这允许我使用XPath获取我的属性,现在我可以这样做:
String terrainFile = config.getString("planets/planet[@name='mars']/terrain");
需要注意的一点是,您需要Apache Commons JXPath lib来使用XPathExpressionEngine,否则在尝试创建它时会出错。