Java android中的XPath XML数据解析速度非常慢
android中的xpath.evaluate解析每次大约需要8-9秒。我使用了大约8种不同的xpath求值方法,我的程序加载大约需要1分35秒 为此,我正在使用AsyncTask,我不想实现标准JDK中未包含的其他解析器 许多LAGY xpath计算代码块之一:Java android中的XPath XML数据解析速度非常慢,java,android,xml,xpath,Java,Android,Xml,Xpath,android中的xpath.evaluate解析每次大约需要8-9秒。我使用了大约8种不同的xpath求值方法,我的程序加载大约需要1分35秒 为此,我正在使用AsyncTask,我不想实现标准JDK中未包含的其他解析器 许多LAGY xpath计算代码块之一: for (int i=1;i<=36;i++){ InputSource source16 = new InputSource(new StringReader(hourly));
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(int i=1;i试着把这一行放到for循环的顶端,我确信它会解决你的问题。但是如果它不试着不使用它。我的意思是试着把你的字符串读入inputstream并使用它
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();
}
}
InputSource16=新的InputSource(新的StringReader(每小时));
对于(int i=1;i我在使用Java SE编写swing程序时遇到了同样的问题。我必须调用xpath.evalute方法大约12次,每次至少需要2-3秒,这使得我的程序非常慢
简单的解决方案是使用子字符串。这听起来可能很幼稚,而且需要做很多工作,但如果您只需要从XML解析10个不同的参数,而且最重要的是XML可靠且格式良好,那么它实际上是可行的
在您的例子中,整个文档中只有8个不同的参数需要解析,这种方法非常容易实现。也可以使用for循环
实现如下内容:
首先,将整个XML文档解析为一个字符串,我们称之为yourXmlDoc,并将湿度值存储在一个字符串数组中
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
}
num1=0;
num2=0;
num3=0;
对于(int i=0;如果我移动“InputSource”行到顶部,然后它只计算1次,然后给出一个异常-->java.io.IOException:Stream closedBecause inputSource读取并完成。请使用字符串变量或其他方法进行计算。我尝试了所有操作,包括将输入源更改为字符串、输入流、字节数组输入流。甚至尝试初始化将源本身输入到字符串和字节数组输入流,但无效。程序不工作。它不工作。错误包括从文件过早结束到“javax.xml.transform.TransformerException”的致命错误好的,我花了大约两倍的代码量和半个小时来实现这一点。我的XML格式当然很好。好的是,它将我的程序的延迟精确地减少了97%。它现在在3秒内运行:)感谢您提供此解决方案。我开始寻找一个好的解析器,但我认为它不会比这更快。在总共3秒钟中,此过程可能需要不到1秒钟的时间。我认为这是正确的答案:)