Apache Digester XML roule 在 bean 上调用自定义 setter
Apache Digester XML roule to invoke a custom setter on a bean
我正在尝试使用 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
等各种组合,但都没有给我想要的结果。我想要的东西看起来很基础我确信解决方案一定很明显但我无法得到它。
预先感谢您的帮助。
我认为带有 "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 规则相当有限 - 它们可以完成所有基本的事情,但会错过很多更高级的功能(自定义规则等),如果您使用定期使用 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(...);
希望对您有所帮助。
我正在尝试使用 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
等各种组合,但都没有给我想要的结果。我想要的东西看起来很基础我确信解决方案一定很明显但我无法得到它。
预先感谢您的帮助。
我认为带有 "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 规则相当有限 - 它们可以完成所有基本的事情,但会错过很多更高级的功能(自定义规则等),如果您使用定期使用 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(...);
希望对您有所帮助。