我正在寻找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拉解析器工作,可以指向我吗?
答案 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)
答案 3 :(得分:0)
我使用libgdx库,它有一个非常好的XmlReader类!
只需复制它并删除此方法parse(FileHandle file)
代码链接: https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/utils/XmlReader.java
也使用导入的ObjectMap
。