当前位置: 代码迷 >> java >> Apache Digester XML规则可在Bean上调用自定义设置程序
  详细解决方案

Apache Digester XML规则可在Bean上调用自定义设置程序

热度:30   发布时间:2023-07-18 08:53:30.0

我正在尝试使用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等的各种组合,但是都没有给我我想要的东西。 我想要的东西看起来很基础,我确信解决方案必须如此明显,但我无法理解。

预先感谢您的帮助。

我认为带有“ 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(...);

希望这可以帮助。

  相关解决方案