我正在做一个从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之后,内存不足的错误就是...
有人能给我一些解决方法的建议吗?
答案 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();