2013-09-30 49 views
0

我想提取由第三方Web服務返回的數據。該響應由XmlPullParser解析。數據塊是單個元素的Base64解碼的TEXT。到目前爲止,我的解析器包含代碼:即時解壓縮Web服務的base64響應?

   assert eventType == XmlPullParser.TEXT; 
       content = xpp.getText(); 

content是所述的數據塊。它的工作原理,但它可以是100 + KBytes長。我需要使用另一個解析器解析內容:

  1. 解碼通過base64編碼的數據塊。結果是一個zip文件的圖像,其中包含一個壓縮文件。

  2. 提取壓縮文件的內容 - 它是CSV格式。

  3. 解析CSV文件的行並提取數據。

如果我知道zip歸檔映像文件的名稱,是否可以使用Android/Java對象實時處理它? (即時消息 - 我的意思是不先將它存儲到文件中。)或者,如何以及從哪裏可以創建從zip文件內容中提取的臨時文件?

回答

2

是的,您可以即時解析這些文件。

byte[] decodedContent = Base64.decode(content, Base64.DEFAULT); 

ZipInputStream zipStream = new ZipInputStream(new ByteArrayInputStream(decodedContent)); 

try{ 
    ZipEntry entry = null; 

    while ((entry = zipStream.getNextEntry()) != null) { 

     String fileName = entry.getName(); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

     byte[] buffer = new byte[1024]; 
     int count; 

     while ((count = zipStream.read(buffer)) != -1) { 
      baos.write(buffer, 0, count); 
     } 

     baos.close(); 
     zipStream.closeEntry(); 

     byte[] bytes = baos.toByteArray(); 

     //Your own code to parse the CSV 
     parseCsvFile(fileName, bytes); 
    } 

}finally{ 
    zipStream.close(); 
} 
+0

我遇到了'zipStream.getNextEntry()'的問題。因爲我已經添加了catch(IOException e){System.out.println(e.getMessage()); }'。它產生無法讀取本地頭版本45.(顯然是我的椅子和鍵盤之間的一些錯誤。)我沒有'decodeContent'保存到下載/ output.zip'和總指揮官爲Android是能夠提取文件。可能是什麼問題呢? – pepr

+0

我在這裏找到了答案http://stackoverflow.com/a/15566221/1346705。我可能處於完全相同的情況。感謝代碼。 – pepr

1

用此方法的base64解碼: http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html

如果你的SDK 8或更高的發展你也可以使用: http://developer.android.com/reference/android/util/Base64.html

使用此解壓縮解碼的base64: http://developer.android.com/reference/java/util/zip/ZipInputStream.html

使用ByteArrayInputStrean使用解壓縮後的base64解壓縮: http://developer.android.com/reference/java/io/ByteArrayInputStream.html

解析cvs文件的更多內容如下: CSV API for Java

+1

SDK有一個內置的解碼器的Base64:http://developer.android.com/reference/android/util/Base64.html –

+1

是,但只有API級別8或更高。我相應地改變了我的答案。 –