修剪XML时出现内存不足错误

时间:2011-04-21 03:17:13

标签: java android xml sax xml-parsing

我正在做一个从http解析XML文件的程序。 并且XML在根标记的前面有一些空间。

因此,我需要在解析之前修剪XML。

这是我写的方法,

     private String trimXML(InputStream inputStream){
        Writer writer = null;
        try{
            writer = new StringWriter();
            char[] buffer = new char[Constants.BUFFER_SIZE];
            try {
                Reader reader = null;
                try {
                    reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
                    int n = 0;                
                    while ((n = reader.read(buffer)) != -1) {
                        writer.write(buffer, 0, n);
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } finally {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return writer.toString().trim();
        }catch(NullPointerException e){
            return null;
        }
    }

现在我面临的一个大问题是,在我几次请求XML之后,内存不足的错误就是...

有人能给我一些解决方法的建议吗?

4 个答案:

答案 0 :(得分:1)

您正在使用StringWriter,这意味着您继续将XML文件内容写入内存中的缓冲区。所以,显然,如果最后一个缓冲区停留在内存中而没有收集垃圾,你将点击OutOfMemory

顺便说一句,我不了解您的计划如何解决您的问题。它只是修剪整个文件。这意味着它将从文档的开头和结尾清除空格。

我的建议是,您无需担心空白区域并使用StAX或任何适合您的方式解析文档。如有必要,在解析过程中修剪一下。

然而,潮红可能会有所帮助。因此,快速修复就可以了,

..
..
String str = writer.toString().trim();
writer.flush();
return str;
..
..

NB: 解析器将忽略XML元素周围的空格。如果你需要修剪一些属性/元素值,那就是另一个故事。

答案 1 :(得分:1)

为什么呢? XML解析器不关心空白区域。如果您收到的是无法解析的XML文档,解决方案是修复发件人,而不是在接收者处捣乱。这样每个人都错了。

答案 2 :(得分:1)

我是否可以建议您尝试解决已经解决的问题?你需要自己编写解析器吗?

我建议不要自己尝试解析XML,而是使用类似于适用于Android的Simple XML库这样的库。我刚刚写了一篇博文,解释了如何将它包含在你的一个项目中:you can find that here

答案 3 :(得分:0)

您可以将InputStream推进到第一次出现'<'使用类似的东西:

    InputStream inputStream = new BufferedInputStream(YOUR_INPUT_STREAM);
    byte[] start = "<".getBytes("UTF-8");
    byte[] potentialStart = new byte[1];

    inputStream.read(potentialStart);
    while(start[0] != potentialStart[0]) {
        inputStream.mark(1);
        inputStream.read(potentialStart);
    }
    inputStream.reset();