Android Studio中使用JDOM2解析XML报错:SAXBuilder无法读取XML文件
问题:JDOM2 SAXBuilder读取XML文件报错
使用JDOM2库编写Android代码读取raw目录下的XML文件时,SAXBuilder无法解析文件,报错信息如下:
org.jdom2.JDOMException: http://xml.org/sax/features/external-general-entities 特性不被SAX驱动org.apache.harmony.xml.ExpatReader支持
相关代码
Java代码
package com.example.books_xmltojson; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.EditText; import org.jdom2.Document; import org.jdom2.input.SAXBuilder; import java.io.InputStream; public class MainActivity extends AppCompatActivity { EditText edittext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edittext = findViewById(R.id.edittext); // SAX builder InputStream input = getResources().openRawResource(R.raw.books); SAXBuilder builder = new SAXBuilder(); try { Document doc = builder.build(input); } catch (Exception e) { edittext.setText(e.toString()); } } }
XML文件(R.raw.books)
// Resources <catalog> <book> <title>XML Developer's Guide</title> <genre>Computer</genre> </book> <book> <title>Midnight Rain</title> <genre>Fantasy</genre> </book> </catalog>
解决方法
报错原因是JDOM2默认尝试启用的外部实体相关SAX特性,在Android自带的ExpatReader中不被支持。只需在初始化SAXBuilder时手动禁用这些特性即可:
修改SAXBuilder的初始化代码如下:
SAXBuilder builder = new SAXBuilder(); // 禁用外部通用实体和参数实体,适配Android的ExpatReader builder.setFeature("http://xml.org/sax/features/external-general-entities", false); builder.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
或者使用JDOM2提供的非验证读取器,默认会禁用这些特性:
import org.jdom2.input.sax.XMLReaders; // ... SAXBuilder builder = new SAXBuilder(XMLReaders.NONVALIDATING);
修改后重新运行代码,即可正常解析XML文件。
内容的提问来源于stack exchange,提问作者Arash
相关产品推荐
相关产品推荐

