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-rulebean-property-setter-rule但都没有给我想要的东西。我想要的似乎很基本,我确信解决方案一定很明显,但我无法得到它。

预先感谢您的帮助。

4

1 回答 1

0

我认为带有“usingElementBodyAsArgument='true'”的调用方法规则应该适合你:

<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 规则是相当有限的——它们可以做所有基本的事情,但错过了很多更高级的功能(自定义规则等),如果你经常使用消化器,你可能会发现自己从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 回答