在 Android 中解析大型 XML 文件

2024-01-08

我正在尝试解析一个相当大的 XML 文件 - 1MB+,但我遇到了一些困难。 我首先尝试将 xml 文件添加到 res/xml 并使用 XmlResourceParser 解析它,但出现异常“数据超出 UNCOMPRESS_DATA_MAX”。经过一番研究后,我发现压缩文件在读取之前必须在内存中解压缩,并且此限制不适用于原始文件。 然而,当尝试使用 SAXParser 解析 res/raw 文件夹中的 xml 文件时,我收到 IOException,没有任何消息和堆栈跟踪:

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.setContentHandler(myXMLHandler);
InputSource src = new InputSource(stream);
xr.parse(src); // IOException

据我了解,这些内存限制不适用于原始资源,但是是什么导致了这个异常呢?

这是来自 logcat 的堆栈跟踪:

11-11 23:47:50.729: WARN/System.err(4886): java.io.IOException
11-11 23:47:50.739: WARN/System.err(4886):     at android.content.res.AssetManager.readAsset(Native Method)
11-11 23:47:50.749: WARN/System.err(4886):     at android.content.res.AssetManager.access$800(AssetManager.java:36)
11-11 23:47:50.759: WARN/System.err(4886):     at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:542)
11-11 23:47:50.759: WARN/System.err(4886):     at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:504)
11-11 23:47:50.769: WARN/System.err(4886):     at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:467)
11-11 23:47:50.779: WARN/System.err(4886):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329)
11-11 23:47:50.790: WARN/System.err(4886):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286)

使用这个 linux 命令分割你的文件split -l 1 main.xml

private String readTxt()
{
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    for(int J=1;J<15;J++)
    {
        int i;
        try
        {
            InputStream raw = this.getAssets().open("xa"+J);    
            i = raw.read();
            while (i != -1)
            {
                byteArrayOutputStream.write(i);
                i = raw.read();
            }
            raw.close();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

用作 SAX 解析中的字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 中解析大型 XML 文件 的相关文章

随机推荐

  • 如何从 v-text 字段或 v-input 字段中删除下划线

    我尝试从 Vuetify 中的 v input v text 或 v autocomplete 字段中删除下划线 但我找不到如何 有没有办法从 Vuetify 中的 v input v text 或 v autocomplete 字段中删除
  • jQuery UI 自动完成在输入字段中显示值而不是标签

    jQuery UI 自动完成的一个潜在的简单问题困扰着我 我的来源是 var ac label One Thing value One Thing label Two Thing value Two Thing 我正在调用小部件 funct
  • 如何创建通用数组? [复制]

    这个问题在这里已经有答案了 我不明白泛型和数组之间的联系 我可以使用泛型类型创建数组引用 private E elements GOOD 但无法创建具有泛型类型的数组对象 elements new E 10 ERROR 但它有效 eleme
  • 如何使用 getattr 从模型中获取外键值

    我有一个模型Project我通过以下指令获得了它的属性 attr getattr project id None project是实例 id是场并且None是默认的返回类型 我的问题是 如果我想用这个来获取外键怎么办 获取客户姓名 proj
  • NPM:运行 npm 时找不到 npm-cli.js

    通常我可以使用安装库npm但是今天安装 yeoman 时遇到了这个错误 请帮忙找出根本原因 D Works phonegap ionic todo gt npm install g yo module js 340 throw err Er
  • SELECT 上触发触发器

    我是触发器新手 在从 sql server 中的数据库表中选择值时需要触发触发器 我尝试过在插入 更新和删除时触发触发器 选择值时有什么方法可以触发触发器吗 我知道只有两种方法可以做到这一点 而且都不是触发器 您可以使用存储过程来运行查询并
  • Angular 4 - 在下拉列表中选择默认值 [Reactive Forms]

    在 Angular 4 中 我在 json 配置文件中定义了以下配置 countries USA UK Canada default UK 我需要使用反应性模块在下拉列表中显示这些 这是执行此操作的代码 ts countries strin
  • 温斯顿:了解日志记录级别

    阅读和摆弄温斯顿 我很困惑为什么日志记录级别按原样排序 以及为什么传输以它们的方式运行 好吧 至少是控制台 如果有人能够 甚至可能彻底 用真实的用例示例解释为什么使用 Winston 进行日志记录会以这种方式工作 我将不胜感激 例如 我像这
  • std::sort 算法内存使用

    我想知道标准库排序算法 例如 std sort 是否使用堆内存进行排序 是否有任何可靠的来源如何找出排序算法或任何标准库算法一般使用哪种类型 堆 堆栈 和多少临时内存 背景是我考虑将一些标准库算法引入嵌入式环境 其中受控的内存使用至关重要
  • 为什么单击对附加元素不起作用?

    我想使用 jQuery 将一些 html 元素从一个容器无休止地移动到另一个容器append函数 但是当我单击已附加的元素时 单击事件将不再触发 基于与我类似的一些线程 我发现附加元素已从其事件侦听器中剥离 我怎样才能避免这种情况 有人可以
  • 将本地核心数据移动到 iCloud

    如何在已使用本地存储 Core Data 的应用程序中启用 iCloud Core Data 我尝试过使用NSPersistentStoreUbiquitousContentNameKey在我的持久存储选项中 不幸的是 此选项启用 iClo
  • 为什么找不到主类?

    我有一个非常简单的代码 package mygame public class RunGame public static void main String args System out println args 0 我可以编译该代码 但
  • 如何向 Swift Playground 添​​加 UIButton?

    所以我打开了 Playground 我只想添加一个简单的 UIButton 或简单的 UIView 用于测试目的 但我无法让它显示 这是我到目前为止所拥有的 import UIKit var uiButton UIButton button
  • 使弹性项目采用内容宽度,而不是父容器的宽度

    我有一个容器 div with display flex 它有一个孩子 a 我怎样才能让孩子出现 内联 具体来说 如何使子级的宽度由其内容决定 而不扩展到父级的宽度 我尝试过的 我将孩子设置为display inline flex 但它仍然
  • .NET SDK 安装不正确

    我在安装 NET SDK 时遇到问题 首先当我进入 Visual Studio 2019 时 它说我缺少 dotnet Runtime sdk 所以我按照它的要求安装了它并重新启动了我的计算机 然后我再次进入 Visual Studio 2
  • 拦截 iOS 上的崩溃

    描述 我想捕获 iOS 应用程序中发生的所有异常并将它们记录到文件中 并最终将它们发送到应用程序使用的后端服务器 我一直在阅读有关此主题的内容 并发现了设备发送的信号的用法并对其进行了处理 但我不确定它是否会违反应用程序商店审查指南 或者可
  • 带悬停的 CSS 动态导航 - 如何使其在 iOS Safari 中工作?

    在我的网站中 我使用纯 CSS 动态菜单 这在桌面浏览器中没问题 但在 iOS iphone ipad 等 上不行 因为触摸界面不支持 hover选择器 我的问题是 在 iOS 上支持此功能的最佳方式是什么 理想情况下 可以通过修补一些 C
  • 将键值对添加到 JavaScript 中的对象数组中?

    如果我有一个这样的数组 var myarray myarray push Name Adam Age 33 myarray push Name Emily Age 32 这给了我一个数组 我可以在其中提取值 例如myarray 0 Name
  • 为什么在使用花括号初始化列表时首选 std::initializer_list 构造函数?

    考虑代码 include
  • 在 Android 中解析大型 XML 文件

    我正在尝试解析一个相当大的 XML 文件 1MB 但我遇到了一些困难 我首先尝试将 xml 文件添加到 res xml 并使用 XmlResourceParser 解析它 但出现异常 数据超出 UNCOMPRESS DATA MAX 经过一