Parsing java streams



我正在尝试从原始数据流访问数据。在访问原始数据流之前,我必须解析/删除xml的任何痕迹。为此,我将原始流转换为字符串数组,并遍历每行以删除xml.

我可以解析/从字符串中删除xml,我可以重新创建数据流。我遇到的问题是阅读每行并存储每个值(年,月,日,功率)while循环失败,在行上出现超出边界的异常:Int year = bb.get(0);

我猜发生这种情况是因为创建的newResult字符串没有通过readLine方法正确读取。这里没有原始数据列表,只有一行原始数据。根据规范,应该有60个(decResult-1的长度为60)

下面是代码。谁能帮我弄清楚为什么while循环不是遍历每一行?谢谢。

try {                   
   HttpRequestBase request = null;
   request = new HttpGet(urlString);
   consumer.sign(request);
   Log.v(TAG, "consumer.sign");
   HttpResponse response = client.execute(request);
   InputStream stream = (InputStream)response.getEntity().getContent();
   String result = convertStreamToString(stream);
   String[] decResult = result.split("<day raw="");
   String newResult = ""; 
   if(decResult.length > 1) {
      for(int i=1; i<decResult.length; i++) {
         decResult[i] = decResult[i].replaceAll(""\/>", "");
         Log.v(TAG, "DecResult = "+ (decResult[i]).toString());
         decResult[i] = decResult[i].replaceAll("</ted5000_mtu_days>","");
         Log.v("DayData", decResult[i].toString());
         newResult = newResult.concat((decResult[i].toString() + "n"));
   }
} 
Log.v("DayData", "newResult = "+ newResult);
Log.v("DayData", "End NewResult");
BufferedReader reader = new BufferedReader(new StringReader(newResult));
String line = null;
while((line = reader.readLine()) != null) {
   Log.v("DayData", "****Entering while loop***");
   Log.v("DayData", "Line = " + line);
   String bytes = Base64.decode(line);
   Log.v("DayData", "Received bytes");
   ByteBuffer bb = ByteBuffer.wrap(bytes.getBytes());
   Log.v("DayData", "ByteBuffer.wrap");
   bb.order(ByteOrder.LITTLE_ENDIAN);
   int year = bb.get(0);
   int month = bb.get(1);
   int day = bb.get(2);
   int power = bb.getInt(3);
   Log.i("DayData", "Date: " +  month + "/" + day + "/" + year +  " Power: " + power);
  }     
  Log.v("DayData", "Exiting while loop");
  } catch (Exception e) {
     e.printStackTrace();
     Log.e("DayData", "Exception: " + e.toString());
     return false;
}
}

您应该使用适合您需要的XML解析器。来自维基百科页面:

用于XML处理的现有api倾向于分为以下几类:

  • 可从编程语言访问的面向流的api,例如SAX和StAX。

  • 可从编程语言访问的树遍历api,例如DOM。

  • XML数据绑定,它提供XML文档和XML之间的自动转换编程语言对象。

  • 声明性转换语言,如XSLT和XQuery。

听起来就像你在空行上爆炸了。由于您已经有了大量的调试日志,您可以通过更改这一行来验证。v("DayData", "Received bytes");变成了这样的东西v("DayData"、"收到字节:"+字节+ ");

您可能仍然应该检查此条件,即使您发现某些其他错误导致了问题。如果您期望一个特定的长度,您可以检查缓冲区上的.limit()是否满足您的期望。

相关内容

  • 没有找到相关文章

最新更新