问题描述
我正在尝试使用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
等的各种组合,但是都没有给我我想要的东西。
我想要的东西看起来很基础,我确信解决方案必须如此明显,但我无法理解。
预先感谢您的帮助。
1楼
我认为带有“ 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(...);
希望这可以帮助。