【发布时间】:2014-06-06 18:25:52
【问题描述】:
为 Android 开发字典应用程序。 XML文件中有一个数据库。使用 DOM 解析器进行解析相当大(72MB)。尝试用 JDOM 解析器解析它:
List<org.jdom2.Element> list = null;
try {
File db = new File(UnZip.DATABASE_PATH);
InputStream stream = new FileInputStream(db);
SAXBuilder builder = new SAXBuilder();
//HERE CODE IS GETTING STUCK
Document document = (Document) builder.build(stream);
org.jdom2.Element rootNode = document.getRootElement();
list = rootNode.getChildren(ENTRY_TAG);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (Element node : list) {
Log.d(LOG_TAG, node.getChildText(ENT_SEQ));
Log.d(LOG_TAG, node.getChildText(REB));
}
此代码给出 OutOfMemory 错误:
06-05 12:45:58.788: E/AndroidRuntime(10068): 致命异常: main 06-05 12:45:58.788: E/AndroidRuntime(10068): java.lang.OutOfMemoryError: [内存耗尽] 06-05 12:45:58.788: E/AndroidRuntime(10068): 在 dalvik.system.NativeStart.main(Native 方法)
我假设代码在这里卡住了:
Document document = (Document) builder.build(stream);
如何避免此错误并从整个 XML 文件(170000 个条目)中找到所需的条目?
【问题讨论】:
-
使用 Sax 或 Pull 解析器。它专为大型 XML 文件设计
-
XMLPullParser 的 JDOM Parser 不是修改版(写的代码更少)吗?我将尝试 SAX 解析器。
-
推荐使用developer.android.com/reference/org/xmlpull/v1/…,因为它更简单、更新。
-
你怎么看?
xpp.setInput( new StringReader ( "<foo>Hello World!</foo>" ) );如何从文件中获取 Xml 字符串,同时避免 OutOfMemory 错误?我的意思不是“Hello World! ” -
使用
setInput (InputStream)。没关系,不用把所有文档都加载到内存中
标签: java android xml out-of-memory jdom