适用于Android的备用XML解析器实现

时间:2010-10-12 06:43:01

标签: java android xml parsing

我正在寻找Android的XML解析解决方案,除了内置的kXML拉解析器。我试图解析从服务器下载的大型(4MB +)XML文件,并且在解析时尝试分配1MB +字节数组后,kXML解析器抛出OutOfMemory错误。一个好的流式XML解析器不应该分配如此大的数组!!

Android中使用的kXML v2解析器似乎已有7年历史。我想尝试别的东西来看看它是否解决了我的问题,理想情况是实现相同的org.xmlpull.v1接口,因为我的代码已经针对它编写了。 Woodstox看起来是一个不错的选择,它有一个XMLPullParser适配器,但显然Android工程师很难包含javax.xml.streaming库。我看到一些相当复杂的“jar-jar”解决方法,但如果有更简单的方法,我宁可不花一大堆时间来讨论Ant。有没有其他人已经得到另一个XML拉解析器工作,可以指向我吗?

4 个答案:

答案 0 :(得分:1)

在最糟糕的情况下,您可能会恢复到SAX,这是最节省内存的方法。虽然我猜你的代码是一个很大的变化。

答案 1 :(得分:1)

到目前为止,我发现的最佳解决方案是一个包含XmlPullParser的旧Javolution库。 Javolution pull解析器实际上并没有实现org.xmlpull.v1.XmlPullParser,但它具有完全相同的方法签名,除了它的方法返回CharSequence而不是String。通过将其包装到自制适配器中,可以轻松解决这个问题。

不幸的是,似乎Javolution pull解析器已经被弃用,并且在JAR的最新版本中找不到,但是我发现了一个旧的JAR文件仍然存在于此:http://download.osgeo.org/webdav/geotools/org/javolution/javolution/3.7.1/

事实证明我的问题是我的XML文件碰巧在它的末尾包含超过1MB的0x00字符,这首先不是合法字符!但是,如果有人想尝试另一个解析器,我希望这可以帮助你。

答案 2 :(得分:0)

我打算将源代码用于StAX实施,您可以下载here。我刚刚发布了一个问题here。还有其他实现。比如Woodstox

答案 3 :(得分:0)

我使用libgdx库,它有一个非常好的XmlReader类! 只需复制它并删除此方法parse(FileHandle file)

即可

代码链接: https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/utils/XmlReader.java

也使用导入的ObjectMap