我在 Android Studio 中使用 JDOM2 库时遇到问题。我的应用程序编译并运行,但一旦使用包含 JDOM 的方法,我就会收到此错误:
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:558)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Caused by: org.jdom2.JDOMException: http://xml.org/sax/features/external-general-entities feature http://xml.org/sax/features/external-general-entities not supported for SAX driver org.apache.harmony.xml.ExpatReader
at org.jdom2.input.SAXBuilder.internalSetFeature(SAXBuilder.java:1011)
at org.jdom2.input.SAXBuilder.configureParser(SAXBuilder.java:984)
at org.jdom2.input.SAXBuilder.buildEngine(SAXBuilder.java:859)
at org.jdom2.input.SAXBuilder.getEngine(SAXBuilder.java:907)
at org.jdom2.input.SAXBuilder.build(SAXBuilder.java:1104)
我已经通读了 JDOM2 GitHub 页面 解释了如何在 Android Studio 中使用 JDOM,但是我收到的错误没有得到解释。我的 XML 文件中没有任何外部实体,所以我不确定为什么会出现此错误。
我编写的 JDOM2 方法在 IntelliJ 中运行良好,但在 Android Studio 中抛出此错误。我不知道现在该怎么做。
我采取的步骤:
<uses-library android:name="org.apache.http.legacy" android:required="false" />
以尝试让 Android Studio 使用支持外部通用实体的 SAX 构建器。即使是非常基本的、微小的 XML,它仍然会崩溃。 (这不是我在我的应用程序中使用的,它只是一个非常简单的示例 XML。)
<root>
<color>
<name>Blue</name>
<hex>0000FF</hex>
</color>
<color>
<name>Red</name>
<hex>FF0000</hex>
</color>
<color>
<name>Green</name>
<hex>00FF00</hex>
</color>
</root>
还有我拉取数据的方法:
public static String getHex(String colorName) throws JDOMException, IOException {
final String filename = "src/main/assets/test.xml";
SAXBuilder parser = new SAXBuilder();
Document test = (Document) parser.build(new File(filename));
Element rootNode = test.getRootElement();
List<Element> colorList = rootNode.getChildren("color");
String hex = "";
for (Element element : colorList) {
if (element.getChildText("name").equalsIgnoreCase(colorName)) {
hex = element.getChildText("hex");
}
}
return hex;
}