java - Apache Commons 配置基于父级获取属性,属性等于值

标签 java xml apache-commons-config

我使用带有 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/

相关文章:

java - javafx场景对象中的根节点是什么?

java - 如何用代码检查Android list 参数

xml - log4j 可以从基本/根元素继承 xml 吗?

java - 使用 apache commons 配置 xpath 查询具有属性的空 XML 元素

java - 如何使用 PropertiesConfiguration 写入多行属性值?

java - 如何在不被分隔的情况下获取属性?

java - 从 http 到 https

java - 无状态 EJB 在企业应用程序客户端中抛出 NullPointerException

xml - 使用 Go 将 XML 中的意外字段解析为结构

java - Spring 无法 Autowiring 存储库