[英]XPath XML data parsing in android very slow
android中的xpath.evaluate解析每个过程大约需要8-9秒。 我使用了大约8种不同的xpath评估方法,并且我的程序需要大约1分35秒来加载。
我为此使用AsyncTask,并且我不想实现标准JDK中未包含的其他解析器。
许多落后的xpath评估代码块之一:
for (int i=1;i<=36;i++){
InputSource source16 = new InputSource(new StringReader(hourly));
try{
humidity = xpath.evaluate("/response/hourly_forecast/forecast["+i+"]/humidity", source16);
}
catch (Exception e) {
e.printStackTrace();
}
}
尝试将此行放在for循环的顶部,我很确定它将解决您的问题。 但是,如果它不尝试不使用它。 我的意思是尝试将您的字符串读入输入流并使用它。
InputSource source16 = new InputSource(new StringReader(hourly));
for (int i=1;i<=36;i++){
try{
humidity = xpath.evaluate("/response/hourly_forecast/forecast["+i+"]/humidity", source16);
}
catch (Exception e) {
e.printStackTrace();
}
}
我们知道,如果您不小心的话,字符串处理可能会成为一种折磨。
当我用Java SE编写一个swing程序时,我遇到了同样的麻烦。 我不得不调用xpath.evalute方法大约12次,每次至少花费2-3秒,这使我的程序非常慢。
简单的解决方案是使用子字符串。 这听起来似乎很幼稚,但需要大量工作,但是如果您要从XML解析10个以下不同的参数,并且最重要的是XML是可靠且格式正确的,那么它实际上是可行的。
如果您只需要在整个文档中解析8个不同的参数,则此方法非常容易实现。 只需使用for循环。
实现这样的事情:首先,将整个XML文档解析为一个字符串。 我们称之为yourXmlDoc。 并将湿度值存储在String数组中。
num1=0;
num2=0;
num3=0;
for (int i=0;i<*number of times you need to repeat*;i++){
num1=yourXmlDoc.indexOf("humidity",num3);
num2=yourXmlDoc.indexOf("/humidity",num1);
num3=num2;
humidity[i]=yourXmlDoc.substring(num1+9,num2-1);
System.out.println(humidity[i]);
.. continue with more parameters to parse and let its starting point be num3
}
PS仅在格式正确的XML情况下才有可能。 否则,它很难实施并且浪费时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.