我使用带有 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>
据我了解,我在这里能做的最好的事情是获取火星地形
设置:
config.getProperty("planets.planet(0).terrain");
不幸的是,我的应用程序没有/不应该有这些行星索引的任何概念。至少,索引不会保持一致。它们可能随时更改,因此像上面那样通过索引引用它们不可靠。
所以,我想要做的是这样的:
config.getProperty("planets.planet[@name=mars].terrain");
正如您可能已经猜到的那样,这是行不通的。我发现的唯一其他方法是迟钝且 Not Acceptable :
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 配置库以添加此类功能,但我只是不愿意接受没有更简单的方法来做到这一点.
重新审视问题
我忽略了什么,如何以更简单的方式实现这一点?这个功能根本不存在吗?
最佳答案
我发现我可以用 XPathExpressionEngine 替换 DefaultExpressionEngine .
XMLConfiguration.setDefaultExpressionEngine(new XPathExpressionEngine());
这允许我使用 XPath 来获取我的属性,我现在可以这样做:
String terrainFile = config.getString("planets/planet[@name='mars']/terrain");
需要注意的一点是,您需要 Apache Commons JXPath 库才能使用 XPathExpressionEngine,否则在尝试创建它时会出现错误。
关于java - Apache Commons 配置基于父级获取属性,属性等于值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18805223/