2015-09-30 2 views
2

Я использую Jsoup в своем приложении для Android, чтобы прочитать xml-файл, чтобы получить поддержку webservice.Jsoup с большим XML

Библиотека Jsoup отлично работает, пока файл xml не содержит нескольких записей.

Но когда я получаю xml с 50k или 60k записей, я заметил, что Jsoup выделяет память до 230MB 240MB. Это проблема, потому что с

android:largeHeap="true" 

У меня есть 256 МБ памяти.

Это код saple, попробуйте сами

public class MainActivity extends ActionBarActivity { 

private static Handler mHandler = new Handler(); 
private static Context context; 
static TextView textView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    textView = (TextView) findViewById(R.id.textView); 


    textView.setText("5 seconds to start task"); 

    context = this.getApplicationContext(); 

    mHandler.postDelayed(new Runnable() { 
     public void run() { 
      new syncDataWS(context).execute(); 
     } 
    }, 5000); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

private static class syncDataWS extends AsyncTask<Void, String, Void> { 

    Context mContext; 

    public syncDataWS(Context context) { 
     this.mContext = context; 
    } 

    @Override 
    public void onPreExecute() { 
     super.onPreExecute(); 
     textView.append("\nStart task"); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     try { 
      publishProgress("Start call XML page"); 
      Document WS_Document = Jsoup.connect("XML_EXAMPLE").maxBodySize(0).timeout(10 * 100000).get(); 
      publishProgress("End call XML page"); 

      publishProgress("Get rows of document"); 
      Elements XML_RESULT_WS = WS_Document.select("row"); 
      publishProgress("Record number : " + Integer.toString(XML_RESULT_WS.size())); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     if (values != null && values.length > 0) { 
      textView.append("\n" + values[0]); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     textView.append("\nEnd task"); 
    } 
} 

}

и это пример XML

<XMLDataResponse xmlns="www.example.net"><XMLDataResult><root xmlns=""><row ID="1" ID2="2" ID3="3" ID4="4" F1="0.000000000000000e+000" F2="0.000000000000000e+000" F3="0.000000000000000e+000" F4="" F5="0.000000000000000e+000" F6="0.000000000000000e+000"/></root></XMLDataResult></XMLDataResponse> 

Возьмите строку метки и не копировать + вставить его, пока вы имеют 60 тысяч записей в вашем примере XML. Поместите его туда, где вы хотите, при условии, что его можно достичь с помощью http-вызова (URL). Скопируйте URL-адрес в код

Jsoup.connect("COPY URL OF XML HERE") 

И вы можете видеть, что я имею в виду.

Мне нужно решение для решения этой проблемы с распределением, потому что иногда не всегда выделение достигает 256 МБ, а мое приложение падает.

+0

поэтому используйте синтаксические анализаторы «sax» или «pull» – pskink

ответ

1

Вы не сможете решить эту проблему с помощью Jsoup, потому что Jsoup создает полное дерево DOM из проанализированного XML, который становится все больше и больше внутри вашей памяти. Jsoup btw. подразумевается как парсер HTML в первую очередь.

Я бы использовал XML-парсер, основанный на событиях, как XMLPullParser.

+0

Я не могу поверить в это. Он работает отлично. Благодаря! ;) – Bruno

Смежные вопросы