1

Apache commons-digester3 を使用して大きな XML ファイルを解析しようとしています。特定のデータのみを抽出することに興味があります。XML は非常に複雑なため、構造全体を構築するのではなく、関心のあるパターンに一致させたいと考えています。

次の XML があるとします。

<?xml version="1.0"?>
<foo>
    <level1>
        <level2>
            <bar>the bar</bar>
        </level2>
    </level1>
</foo>

そして、解析したい次のドメインオブジェクトがあります。

package my.pkg;

public class Foo {
    private String bar;

    // Note the name of the setter is not "setBar" but rather "setTheBar"
    public void setTheBar(String bar) {
        this.bar = bar;
    }
}

そして今、私はそれらを正しくするのに問題を抱えているXMLルールを持っています:

<digester-rules>
    <pattern value="foo">
        <object-create-rule classname="my.pkg.Foo"/>
        <pattern value="level1/level2/bar">
            <!--What do I need to pout on here the get "the bar" value injected into my Foo instance-->
        </pattern>
    </pattern>
</digester-rules>

set-method-rule、などのあらゆる種類の組み合わせを試しbean-property-setter-ruleましたが、すべてが私が望むものを与えることができませんでした. 私が欲しいものはとても基本的なように思えますが、解決策はとても明白でなければならないと確信していますが、私はそれを得ることができません.

よろしくお願いいたします。

4

1 に答える 1

0

「usingElementBodyAsArgument='true'」を使用した call-method-rule が機能するはずです。

<digester-rules>
  <pattern value='foo'>
  <object-create-rule classname='my.pkg.Foo'/>
    <pattern value='level1/level2/bar'>
      <call-method-rule methodname='setTheBar'
                        usingElementBodyAsArgument='true'/>
    </pattern>
  </pattern>
</digester-rules>

ただし、XML ルールはかなり制限されていることに常に注意してください。基本的なことはすべて実行できますが、より高度な機能 (カスタム ルールなど) がかなり欠けています。digester を定期的に使用すると、ある時点で、XML ルールをプログラム ルールに変換します。個人的には、必要なことはいつでもできることを知っているので、今は常にプログラムのルールを使用しています。

上記の XML 規則に相当するプログラムは次のようになります。

RulesModule rules = new AbstractRulesModule() {
  @Override
  public void configure() {
    forPattern("foo")
        .createObject().ofType(Foo.class);
    forPattern("foo/level1/level2/bar")
        .callMethod("setTheBar")
        .withParamCount(1)
        .usingElementBodyAsArgument();
  }
};

DigesterLoader loader = DigesterLoader.newLoader(rules);
Digester digester = loader.newDigester();

Foo foo = (Foo)digester.parse(...);

お役に立てれば。

于 2015-07-31T06:49:30.607 に答える