3

准确地说,我的问题是Digester.createLoader(url)new的替代方法是什么Digester3

commons-digester:1.8.1 代码

    URL url;
    ClassLoader curClassLoader = this.getClass().getClassLoader();
    url = curClassLoader.getResource("filepath");

    if (url != null) {          
        Digester tempDigester = DigesterLoader.createDigester(url);
        ----
        ----
        }

现在我已经升级commons-digester-1.8.1org.apcahe.commons.Digester3-3.2新 jar 并没有看到任何方法createDigester(ur);

如何替换DigesterLoader.createDigester(url)使用新 API 来获取 Digester 对象作为回报。

commons-digester:3.2 代码

    URL url;
    ClassLoader curClassLoader = this.getClass().getClassLoader();
    url = curClassLoader.getResource("filepath");

    if (url != null) {          
        Digester tempDigester = ???;
        ----
        ----
        }

提前致谢。

4

1 回答 1

2

尚未检查 1.8 版本的确切功能,但假设您的 URL 解析为基于 XML 的规则流,那么这样的事情应该可以解决问题:

import org.apache.commons.digester3.Digester;
import org.apache.commons.digester3.binder.DigesterLoader;
import org.apache.commons.digester3.binder.RulesModule;
import org.apache.commons.digester3.xmlrules.FromXmlRulesModule;

final URL url = curClassLoader.getResource("filepath");

RulesModule rules = new FromXmlRulesModule() {
  @Override
  protected void loadRules() {
    loadXMLRules(url);
  }
};

DigesterLoader loader = DigesterLoader.newLoader(rules);
Digester digester = loader.newDigester();

请注意,您可能必须使您的 URL 最终化才能在匿名子类中使用它。

使用以下简单规则文件进行测试:

<?xml version='1.0'?>
<!DOCTYPE digester-rules PUBLIC '-//Apache Commons //DTD digester-rules XML V1.0//EN' 'http://commons.apache.org/digester/dtds/digester-rules-3.0.dtd'>
<digester-rules>
  <pattern value='data'>
    <object-create-rule classname='test.digester.BasicTest$ClassA'/>
    <bean-property-setter-rule pattern='name' propertyname='name'/>
  </pattern>
</digester-rules>

需要 DOCTYPE 声明,但可以使用或不使用 XML 声明。在没有 DOCTYPE 的情况下运行会给出:

Parse Error at line 1 column 17: Document root element "digester-rules", must match DOCTYPE root "null"
于 2017-11-23T08:39:32.820 回答