0

アプリケーションの構成に 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>

私が理解しているように、火星の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 構成ライブラリをラップ/拡張することを検討しているところまで来ましたが、これを行うためのより簡単な方法がないことを受け入れたくありません。 .

質問の再検討

私は何を見落としていますか?これをより簡単な方法で実現するにはどうすればよいですか? この機能は単に存在しないのでしょうか?

4

1 に答える 1

1

DefaultExpressionEngine をXPathExpressionEngineに置き換えることができることがわかりました。

XMLConfiguration.setDefaultExpressionEngine(new XPathExpressionEngine());

これにより、XPath を使用してプロパティを取得できるようになり、次のことができるようになりました。

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

注意すべきことの 1 つは、XPathExpressionEngine を使用するには Apache Commons JXPath ライブラリが必要であり、そうしないと作成しようとしたときにエラーが発生することです。

于 2013-09-14T19:10:30.777 に答える