繁体   English   中英

Android中的XPath XML数据解析非常慢

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM