OpenNLP:documentBuilderFactory.setFeature(“http://javax.xml.XMLConstants/feature/secure-processing”,true)ParserConfigurationException

时间:2017-11-11 21:33:46

标签: java android xml

所以我试图在Android Studio中使用OpenNLP,但是我的应用程序总是在OpenNLP在其XmlUtil类中使用的代码体中抛出ParserConfigurationException,我无法修改它: / p>

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

现在已经坚持了一个星期而且没有运气,有关如何解决此错误的任何提示?

3 个答案:

答案 0 :(得分:1)

事实证明,使用给定的网址" http://javax.xml.XMLConstants/feature/secure-processing"对应于XMLConstants.FEATURE_SECURE_PROCESSING - >当XMLUtils类使用它来设置documentBuilderFactory的功能时 - >它将始终抛出异常,因为由于某种原因无法识别此XMLConstant。

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

我需要将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库中使用稍微修改过的代码!

答案 1 :(得分:0)

使用OpenNLP 1.9.1版时,我遇到了同样的问题,我改用了版本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:由于操作说明中的ParserConfigurationException而失败
  • 1.8.0和1.7.0:尝试加载NameFinderME时,两者均因OutOfMemoryError崩溃

答案 2 :(得分:0)

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