Android 上 javax.xml.parsers 的 ParserConfigurationException

ParserConfigurationException with javax.xml.parsers on Android

我正在尝试在 Android 上使用 javax.xml.parsers,但在尝试设置这两个功能时我总是遇到 ParserConfigurationException :

factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);

这是我的代码

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(false);
    factory.setValidating(false);
    try {
            factory.setFeature("http://xml.org/sax/features/namespaces", false);
            factory.setFeature("http://xml.org/sax/features/validation", false);
            factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
            factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);

    } catch (ParserConfigurationException e) {
            e.printStackTrace();
    }

功能名称是完全限定的 URI。实现可以定义自己的特性。如果此 DocumentBuilderFactory 或其创建的 DocumentBuilder 不支持该功能,则会抛出 ParserConfigurationException。 DocumentBuilderFactory 可以公开功能值但无法更改其状态。

developer.android.com 上的文档说

Feature names are fully qualified URIs. Implementations may define their own features. An ParserConfigurationException is thrown if this DocumentBuilderFactory or the DocumentBuilders it creates cannot support the feature. It is possible for an DocumentBuilderFactory to expose a feature value but be unable to change its state.

但是 xerces.apache.org

中似乎存在此功能

所以我想这意味着 Android SDK 目前不支持这些功能(用于文档验证)。

仅供参考。我使用 Android Arsenal EpubParser 中可用的 Epub 解析器库发现了这些错误。我不是唯一发现这个问题的人。看起来这个库有问题,因为关于代码使用了这两个不受支持的功能:

factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);