使用Commons Digester将默认值解析为Properties

时间:2013-07-24 12:14:08

标签: java xml-parsing apache-commons-digester

<properties>
   <property name="p1">v1</property>
   <property name="p2">v2</property>
</properties>

我想将其解析为Properties对象 {"p1"="v1", "p2"="v2"}。我能用公共消化器做这么多。

forPattern("properties").createObject()
        .ofType(Properties.class);
forPattern("properties/property")
        .callMethod("put").withParamCount(2)
        .withParamTypes(Object.class, Object.class).then()
        .callParam().fromAttribute("name").ofIndex(0).then()
        .callParam().ofIndex(1);

此外,我还想传递一个默认的Properties对象。即,而不是new Properties(),我需要new Properties(defaults)来创建属性实例。我知道.usingConstructor(Properties.class).then()但没有找到将现有Properties对象作为参数传递的方法。

我正在使用v3.3.2。 非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

我发现这可以使用FactoryCreateRule

来完成
class PropertiesFactory extends AbstractObjectCreationFactory<Properties> {

    Properties defaultProperties;

    public PropertiesFactory(Properties defaultProperties) {
        super();
        this.defaultProperties = defaultProperties;
    }

    @Override
    public Properties createObject(Attributes attributes) throws Exception {
        return new Properties(defaultProperties);
    }

}

...
...

forPattern("properties").factoryCreate()
        .usingFactory(new PropertiesFactory(defaultProperties));
forPattern("properties/property")
        .callMethod("put").withParamCount(2)
        .withParamTypes(Object.class, Object.class).then()
        .callParam().fromAttribute("name").ofIndex(0).then()
        .callParam().ofIndex(1);