Разбор потоков Java - PullRequest
       38

Разбор потоков Java

1 голос
/ 22 ноября 2011

Я пытаюсь получить доступ к данным из потока необработанных данных.Прежде чем получить доступ к потоку необработанных данных, я должен проанализировать / удалить любые следы 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;
}
}

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Вы должны использовать синтаксический анализатор XML, который соответствует вашим потребностям. Из википедии страница :

Существующие API для обработки XML имеют тенденцию делиться на следующие категории:

  • Потоково-ориентированные API, доступные на языке программирования, например SAX и StAX.

  • API обхода дерева, доступные из языка программирования, например DOM.

  • Привязка данных XML, обеспечивающая автоматический перевод между документом XML и объекты языка программирования.

  • Языки декларативного преобразования, такие как XSLT и XQuery.

1 голос
/ 22 ноября 2011

Звучит так, будто вы бомбите пустую линию.Поскольку у вас уже есть много журналов отладки, вы можете проверить это, изменив эту строку Log.v («DayData», «Received bytes»);что-то вроде этого Log.v ("DayData", "Полученные байты: \" "+ bytes +" \ "");

Вы, вероятно, все еще должны проверить это условие, даже если вы обнаружите, что какая-то другая ошибкавызывая проблему.Если вы ожидаете определенной длины, вы можете проверить, что .limit () в буфере соответствует вашим ожиданиям.

...