如何将消化器规则设置为忽略具有特定属性值的元素?例如,考虑到下面的XML和digester规则,我如何告诉它忽略名为"Alex“的参数?
XML:
<input-parameters>
<parameter>
<name><![CDATA[Steve]]></name>
<description><![CDATA[Footballer]]></description>
</parameter>
<parameter>
<name><![CDATA[Adam]]></name>
<description><![CDATA[Author]]></description>
</parameter>
<parameter>
<name><![CDATA[Lynda]]></name>
<description><![CDATA[Blacksmith]]></description>
</parameter>
<parameter> <!--I want to ignore this whole parameter element.-->
<name><![CDATA[Alex]]></name>
<description><![CDATA[Showjumper]]></description>
</parameter>
</input-parameters>当前的XML规则:
<pattern value="input-parameters">
<object-create-rule classname="java.util.HashSet"/>
<set-next-rule methodname="addParameters"/>
<pattern value="parameter">
<object-create-rule classname="com.foo"/>
<set-next-rule methodname="add"/>
<bean-property-setter-rule pattern="name" propertyname="name" />
<bean-property-setter-rule pattern="description" propertyname="description" />
</pattern>
</pattern>发布于 2015-07-25 02:24:01
我不认为消化器支持这一点,但我可以提出一些可能有助于你达到目标的选择。
最简单的方法就是使用一个自定义HashSet实现,它拒绝您不喜欢的名称:
public class MyHashSet extends HashSet<Parameter> {
@Override
public boolean add(Parameter param) {
if (param != null && "Alex".equals(param.getName())) {
return false;
}
return super.add(param);
}
}然后用它代替规则中的标准HashSet:
<pattern value="input-parameters">
<object-create-rule classname="com.foo.MyHashSet"/>
<set-next-rule methodname="addParameters"/>
...
</pattern>我从这种方法中看到的主要缺点是,在结果对象中留给您的是自定义哈希集实现,因此如果以后尝试直接从代码中添加一个具有name = "Alex“的参数,它将再次被拒绝;这可能是一个问题,也可能不是问题。
一种稍微复杂的方法是使用自定义实现切换出标准的SetNextRule,该实现在添加参数之前检查名称。标准的SetNextRule会在事件结束时触发,所以下面的规则将起作用:
public class SetNextParamRule extends SetNextRule {
public SetNextParamRule() {
super("add");
}
@Override
public void end(String namespace, String name) throws Exception {
Parameter param = (Parameter)getChild();
if (!"Alex".equals(param.getName())) {
super.end(namespace, name);
}
}
}这种方法的一个问题是,我看不到使用XML配置添加自定义规则的方法(我很少使用XML配置,因此这里可能出错),因此您需要使用代码配置:
final Rule setNextParamRule = new SetNextParamRule();
RulesModule rules = new AbstractRulesModule() {
@Override
public void configure() {
forPattern("input-parameters")
.createObject().ofType(HashSet.class)
.then().setNext("addParameters");
forPattern("input-parameters/parameter")
.createObject().ofType(Parameter.class)
.then().addRule(setNextParamRule);
forPattern("input-parameters/parameter/name").setBeanProperty();
forPattern("input-parameters/parameter/description").setBeanProperty();
}
};
DigesterLoader loader = DigesterLoader.newLoader(rules);
Digester digester = loader.newDigester();然而,这样做的一个优点是,您可以从单独的源中提供要忽略的名称列表:
import com.google.common.collect.ImmutableSet;
final Set<String> skipNames = ImmutableSet.of("Alex", "Adam");
final Rule setNextParamRule = new SetNextRule("add") {
@Override
public void end(String namespace, String name) throws Exception {
Parameter param = (Parameter)getChild();
if (!skipNames.contains(param.getName())) {
super.end(namespace, name);
}
}
};
// rest as above希望这能帮上忙。
https://stackoverflow.com/questions/31609634
复制相似问题