解析java流

解析java流,java,stream,byte,decode,Java,Stream,Byte,Decode,我试图从原始数据流访问数据。在访问原始数据流之前,我必须解析/删除任何xml痕迹。为此,我将原始流转换为字符串数组,并遍历每一行以删除xml 我可以解析/删除字符串中的xml,然后重新创建数据流。我的问题是读取每一行并存储每一个值(年、月、日、功率) while循环失败,该行出现越界异常: int year=bb.get(0) 我猜这是因为创建的newResult字符串没有通过readLine方法正确读取。没有原始数据列表,只有一行原始数据。根据规范,应为60(且decResult-1的长度为6

我试图从原始数据流访问数据。在访问原始数据流之前,我必须解析/删除任何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;
}
}
试试{
HttpRequestBase请求=null;
请求=新的HttpGet(urlString);
消费者签名(请求);
日志v(标签“消费者签名”);
HttpResponse response=client.execute(请求);
InputStream=(InputStream)response.getEntity().getContent();
字符串结果=convertStreamToString(流);
字符串[]decResult=result.split(“1){
对于(int i=1;i“,”);
Log.v(标记,“DecResult=“+(DecResult[i]).toString());
decResult[i]=decResult[i].replaceAll(“,”);
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));
字符串行=null;
而((line=reader.readLine())!=null){
Log.v(“DayData”和“****输入while循环***”);
Log.v(“DayData”,“Line=“+Line”);
字符串字节=Base64.解码(行);
Log.v(“DayData”,“接收字节”);
ByteBuffer bb=ByteBuffer.wrap(bytes.getBytes());
Log.v(“DayData”、“ByteBuffer.wrap”);
bb.order(ByteOrder.LITTLE_ENDIAN);
int year=bb.get(0);
整月=bb.get(1);
int day=bb.get(2);
int-power=bb.getInt(3);
日志i(“日数据”,“日期:+月+”/“+日+”/“+年+”功率:+功率);
}     
Log.v(“DayData”,“退出while循环”);
}捕获(例外e){
e、 printStackTrace();
Log.e(“DayData”,“Exception:+e.toString());
返回false;
}
}

听起来像是在空行上轰炸。由于您已经有很多调试日志记录,您可以通过将此行Log.v(“DayData”,“Received bytes”);更改为类似于此Log.v(“DayData”,“Received bytes:\”“+bytes+”\)的内容来验证这一点


您可能仍然应该检查此情况,即使您发现其他错误导致了此问题。如果您期望某个长度,可以检查缓冲区上的.limit()是否符合您的期望。

您应该使用适合您需要的XML解析器。来自wikipedia:

用于XML处理的现有API通常分为以下几类:

  • 可从编程语言(例如SAX和StAX)访问的面向流的API

  • 可从编程语言(例如DOM)访问的树遍历API

  • XML数据绑定,它在XML文档和 编程语言对象

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


您是否考虑过将流注入XML解析器中,并遍历DOM树?我已经尝试解析XML,但它似乎不符合标准XML格式……是的,您是对的。我在空行上进行轰炸,因为存在解析问题。而不是使用DOM解析器,而是尝试删除XML元素。从字符串中提取并从原始格式中检索每段数据。我假设这样做会修改原始数据格式,这有一个基本问题。我不想麻烦使用DOM树。我会使用拉式解析器。感谢您的建议。我不熟悉拉式解析器,但DOM树工作正常。您处理大型数据吗数据量?DOM将大大降低速度并需要更多内存。如果您不处理大量数据,这无关紧要,但如果您处理了大量数据,这将产生很大的影响。感谢您提供的信息。幸运的是,我没有处理大量数据。谢谢。最终,这是主要问题。