2010-11-11 94 views
1

我想解析一個相當大的XML文件 - 1MB +,但我遇到了一些困難。 我首先嚐試將xml文件添加到res/xml中,並使用XmlResourceParser解析它,但我得到一個異常說「數據超出UNCOMPRESS_DATA_MAX」。經過一番研究後,我發現壓縮文件在讀取之前必須在內存中解壓縮,並且此限制不適用於原始文件。 但是試圖解析從資源xml文件/原始文件夾與SAXParser的時候,我得到一個IOException,沒有任何消息和堆棧跟蹤:解析Android中的大型XML文件

SAXParserFactory spf = SAXParserFactory.newInstance(); 
SAXParser sp = spf.newSAXParser(); 
XMLReader xr = sp.getXMLReader(); 
xr.setContentHandler(myXMLHandler); 
InputSource src = new InputSource(stream); 
xr.parse(src); // IOException 

從我瞭解的內存限制並不適用於原料資源,但是什麼導致了這個異常呢?

這裏是logcat的堆棧跟蹤:

11-11 23:47:50.729: WARN/System.err(4886): java.io.IOException 
11-11 23:47:50.739: WARN/System.err(4886):  at android.content.res.AssetManager.readAsset(Native Method) 
11-11 23:47:50.749: WARN/System.err(4886):  at android.content.res.AssetManager.access$800(AssetManager.java:36) 
11-11 23:47:50.759: WARN/System.err(4886):  at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:542) 
11-11 23:47:50.759: WARN/System.err(4886):  at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:504) 
11-11 23:47:50.769: WARN/System.err(4886):  at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:467) 
11-11 23:47:50.779: WARN/System.err(4886):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329) 
11-11 23:47:50.790: WARN/System.err(4886):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286) 
+0

請寄出logcat的輸出。如果沒有至少獲得logcat錯誤級別輸出,則不可能引發異常。 – 2010-11-11 22:39:34

+0

我複製logcat的輸出。 – Krassi 2010-11-11 22:50:35

+0

您是否嘗試過使用XML <1MB的此方法。只是爲了排除它 – Mikpa 2010-11-14 22:24:02

回答

0

分割使用這個linux命令您的文件拆分-11 main.xml中

private String readTxt() 
{ 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    for(int J=1;J<15;J++) 
    { 
     int i; 
     try 
     { 
      InputStream raw = this.getAssets().open("xa"+J);  
      i = raw.read(); 
      while (i != -1) 
      { 
       byteArrayOutputStream.write(i); 
       i = raw.read(); 
      } 
      raw.close(); 
     } 
     catch (IOException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

用作串到你的SAX解析。