【问题标题】:OpenNLP: documentBuilderFactory.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true) ParserConfigurationExceptionOpenNLP:documentBuilderFactory.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true) ParserConfigurationException
【发布时间】:2017-11-11 21:33:45
【问题描述】:

所以我尝试在 Android Studio 中使用 OpenNLP,但我的应用程序总是在 OpenNLP 在其 XmlUtil 类中使用的这段代码中抛出 ParserConfigurationException,我无法修改:

public static DocumentBuilder createDocumentBuilder() {
    try {
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        documentBuilderFactory.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true);
        return documentBuilderFactory.newDocumentBuilder();
    } catch (ParserConfigurationException var1) {
        throw new IllegalStateException(var1);
    }
}

documentBuilderFactory.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true); 导致应用程序抛出 ParserConfigurationException。

在这个问题上卡了大约一个星期,没有运气,有什么提示可以解决这个错误吗?

【问题讨论】:

    标签: java android xml


    【解决方案1】:

    所以事实证明,使用给定的 URL "http://javax.xml.XMLConstants/feature/secure-processing" 对应于 XMLConstants.FEATURE_SECURE_PROCESSING -> 当 XMLUtils 类使用它来设置 documentBuilderFactory 的特性时 -> 它总是会抛出一个异常,因为这个 XMLConstant 不是由于某种原因被识别。

    为了解决这个问题,因为 XMLUtil.java 类在 opennlp-tools-1.8.3.jar 文件中被使用/抓取时是不可修改的:

    我需要将 opennlp-tools-1.8.3.jar 提取到它的 .class 文件中,然后使用 ClassEditor(用于编辑 .class 文件的程序)来更改正在设置的功能:

    我将 XMLUtil.java 文件中的特性值更改为另一个不会导致该函数抛出异常的值:

    public static DocumentBuilder createDocumentBuilder() {
        try {
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true);
            return documentBuilderFactory.newDocumentBuilder();
        } catch (ParserConfigurationException var1) {
            throw new IllegalStateException(var1);
        }
    }
    

    这让我可以解决以前无法修改的 XMLUtil.java 文件,现在 documentBuilderFactory.setFeature 不会抛出异常,让我可以使用 OpenNLP 库中稍作修改的代码!

    【讨论】:

      【解决方案2】:

      我在使用 1.9.1 版的 OpenNLP 时遇到了同样的问题,我改用 1.6.0 版 解决了这个问题。这是我设法开始工作的最新版本。

      dependencies {
        implementation 'org.apache.opennlp:opennlp-tools:1.6.0'
      }
      

      降级是无缝的,因为模型相同并且公共 API 大体相似(至少对我来说是这样)。


      全文:我正在使用 OpenNLP 制作一个prototype,以使用一个TokenizerME 和两个NameFinderME——用于人员和位置。这些是我尝试过(但失败了)的所有 OpenNLP 版本:

      • 1.9.1 和 1.9.0:使用 OP 中描述的 ParserConfigurationException 失败
      • 1.8.0 和 1.7.0:在尝试加载 NameFinderME 时都会崩溃并显示 OutOfMemoryError

      【讨论】:

        【解决方案3】:

        @Keaton MacLeod 的回答也对我有用,但我没有修改类文件,而是在克隆源代码库并重建所需的 jar 文件后编辑了 XmlUtil.java 文件。评论或删除 this line 和 this one。按照their build instructions 构建opennlp项目 将生成的 jar 添加到您的项目中,它应该可以按预期工作

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-22
          • 2017-11-04
          • 2022-12-28
          • 1970-01-01
          • 2013-02-02
          • 2022-11-11
          • 2015-11-12
          • 1970-01-01
          相关资源
          最近更新 更多