1

我尝试在 xml 文件 (xmlrules) 中编写 Apache 摘要器解析规则。但我在 digester-rules.dtd 中没有看到类似 PluginCreateRule 的内容。问题是:(如何)我可以在 xml 规则文件中声明和引用插件吗?

4

1 回答 1

0

我认为你在这里不走运。

如您所见,plugin-create-ruleDTD 文件中没有。plugin-create-rule此外,Digester 使用自己来解析 XML 规则,并且在digester 配置中没有提及。

查看该代码,添加该规则似乎非常简单,所以我不确定它是否被遗漏只是因为没有人可以添加它,或者因为实现存在一些问题不是很明显。

我会尝试一个补丁来实现这个,但是这些天在 Digester开发中似乎没有什么活动......

更新

是的 - 创建一个支持这一点的基本实现似乎相当简单:

  • 添加一个方法来binder/PluginCreateRuleBuilder支持通过类名创建而不仅仅是类实例(只是从 复制代码ObjectCreateBuilder)。
  • 添加一个新xmlrules/PluginCreateRule类(同样,基于ObjectCreateRule大部分被丢弃)。
  • 将规则添加到XmlRulesModule.
  • 将规则添加到 DTD。

完整的补丁文件在这里

使用Digester Plugin doco中的示例和以下 XML进行了测试

<digester-rules>
  <pattern value="pipeline">
    <object-create-rule classname="Pipeline"/>
    <pattern value="source">
      <call-method-rule methodname="setSource" paramcount="1"/>
      <call-param-rule paramnumber="0" attrname="file"/>
    </pattern>
    <pattern value="transform">
      <plugin-create-rule pluginclass="Transform"/>
    </pattern>
    <pattern value="destination">
      <call-method-rule methodname="setDest" paramcount="1"/>
      <call-param-rule paramnumber="0" attrname="file"/>
    </pattern>
  </pattern>
</digester-rules>

请注意,这只是一个基本的概念验证,但如果您想这样做,应该可以为您提供一些工作。此外,还有更多用于创建插件的选项,这些选项未包含在此范围内,并且是完整解决方案所必需的,因此此补丁(在当前状态下)不适合提交回 Digester 项目。

更新 2

要调用它,您需要PluginRules在创建消化器时将一个实例传递给加载器:

DigesterLoader loader = DigesterLoader.newLoader(new FromXmlRulesModule() {
  ...
});

Digester digester= loader.newDigester(new PluginRules());

干杯,

于 2015-03-01T01:04:58.257 回答