Поиск в <tr>html строки таблицы с использованием jsoup в java для Android 2.1 - PullRequest
0 голосов
/ 14 января 2012

Я использую Eclipse для разработки приложения для Android 2.1 с использованием базовой библиотеки jsoup 1.6.1 для подключения к веб-странице и очистки HTML.До сих пор приложение, вставленное ниже, подключается к веб-странице с помощью метода jsoup connect, создает документ с помощью метода jsoup get, затем выбирает все строки таблицы Elements, а затем получает все элементы этой строки таблицыс помощью jsoup getAllElements, (в данном случае Elements), проверяет их на наличие текста и, если содержит определенную подстроку, преобразует текст в строку с помощью метода text jsoup и добавляет их в коллекцию строк ListArray, отображаяих в андроиде ListView.Ниже приведены мои 2 вопроса, а затем код.

Кажется, что код работает на моем эмуляторе, возвращая данные строк, однако есть ошибка, при которой Android отображает каждую строку с информацией String в двух экземплярах, которую яне могу отследить.

Кроме того, я хотел знать, существует ли более оптимальный метод для более быстрого выполнения этих задач с использованием jsoup или другой библиотеки java / android, и хотел узнать какие-либо предложения.Например, кажется, что когда я запускаю этот код на странице, содержащей много данных, это занимает немного больше времени, чем мне бы хотелось.Например, я загружаю всю страницу и создаю jsoup doc перед выполнением какой-либо операции с данными или возвратом какой-либо из них пользователю.Если бы мне пришлось подключиться к странице, найти первый HTML-элемент таблицы строк, проверить дочерние элементы на наличие текста, содержащего подстроку, я мог бы потенциально вернуть информацию конечному пользователю Android быстрее и с меньшими затратами на загрузку всего документа.,Я не был уверен, какие методы jsoup дадут что-то для этого.

Я очень плохо знаком с jsoup и java и несколько менее нов (но все еще учусь) в других языках, таких как C и C #.Правильное форматирование вставленного текста оставляло желать лучшего, и я не смог успешно использовать тег prettify при просмотре в Chrome и заранее извинялся, если пропустил ввод символа или конечного блока при копировании и вставке теста.Еще раз спасибо

Jsoupx1.Activity.java

    package jsoup.example1;
    import java.io.IOException;
    import java.util.ArrayList;
    import android.app.ListActivity;
    import android.os.Bundle;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;
    import android.view.View;

    public class Jsoupx1Activity extends ListActivity {

    public void onCreate(Bundle icicle) {
            super.onCreate(icicle);


   //ArrayList tableRowStrings will be the recipient of table row data that matches a search criterion, 
   //stored in the form of strings.
   ArrayList<String> tableRowStrings = new ArrayList<String>();

    //Open a document from a valid URL using jsoup
    Document doc = null;
            try {
                doc = Jsoup.connect("http://www.w3schools.com/html/html_tables.asp").get();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            //Once this document has loaded, select all <tr> tableRow elements into tableRows, with each
            //tableRow, collect all children, which will be <td>, into tableDatas Elements, test that Elements class for text,
            //if text exists, transfer the text of these children to a string, test that string for a substring, 
            //In this case, a date, if it contains this substring, add it to the created tableRowStrings ArrayList.
            //This function falsely returns a string with duplicated table row information.

            //Example Test Criteria, in reality this may be interfaced to a datetime or textbox widget
            //to facilitate an end-user defined search
            String testString  = "Apples";

            //select all <tr> or Table Row Elements
            Elements tableRows = doc.select("tr");

            //Load ArrayList with table row strings
            for (Element tableRow : tableRows){

                 Elements tableDatas = tableRow.getAllElements();

                 //Test if the the TableData contains Text, if so convert that text to a string rowData
                 if (tableDatas.hasText()){
                     String rowData = tableDatas.text();

                     if (rowData.contains(testString)){
                         tableRowStrings.add(rowData);
                     }

                 }

        } 

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, tableRowStrings);
            setListAdapter(adapter);
        }

    @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
            String item = (String) getListAdapter().getItem(position);
            Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show();
        }
    }

И сопровождающий main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

 <TextView   
    android:id="@+id/text"
    android:textStyle="bold"   
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    /> 


<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textSize="16sp" >
</TextView>

<ListView
  android:id="@+android:id/list"
  android:layout_width="fill_parent" 
   android:textColor="#444444"
    android:cacheColorHint="#00000000"
         android:layout_height="wrap_content" 
 >
</ListView>

</LinearLayout>

Ответы [ 2 ]

0 голосов
/ 15 января 2012

После возврата к документации jsoup выясняется, что метод Jsoup.connect(String url) просто предоставляет интерфейс для веб-страницы или файла html, а не метод загрузки всего документа. get() выполняет запрос как GET и анализирует результат, возвращая проанализированный документ. При некотором тестировании операция Jsoup.connect().get() отнимает больше всего времени. Похоже, что ни одна из других опций Jsoup не позволила бы гранулярному анализу быстрее доставлять контент. Другой вариант заключается в том, чтобы попробовать другую библиотеку или использовать подход Web Dyno и метод Jsoup.connect().post() для подключения к прокси-странице, которая сама по себе обеспечивает функциональность очистки по аналогии с приложением для Android в следующем сообщении в блоге: ссылка ниже. Я просто жду истечения необходимого 24-часового периода, чтобы я мог принять ответ, если только я не должен был просто удалить это сообщение, я не был уверен ... http://ifdefined.com/blog/post/A-Hacker-News-app-for-Android.aspx

0 голосов
/ 15 января 2012

Чтобы устранить проблему, когда в строке имелись дублированные копии данных таблицы, я заменил логику в блоке foreach.Предыдущая неправильно работающая версия:

Elements tableDatas = tableRow.getAllElements();

//Test if the the TableData contains Text, if so convert that text to a string rowData
         if (tableDatas.hasText()){
             String rowData = tableDatas.text();

             if (rowData.contains(testString)){
                 tableRowStrings.add(rowData);
             }

         }

Обновленная версия:

if (tableRow.hasText()){
    String rowData = tableRow.text();
    if(rowData.contains(testString)){
        tableRowStrings.add(rowData);
    }
}

Это, похоже, решает проблему.Кажется, теперь немного быстрее.Я не уверен, почему он собирал 2 копии данных таблиц в предыдущей версии, и я полагаю, что именно поэтому я назвал это ошибкой, которая может быть не истинной, а просто моим неправильным пониманием кода.

По вопросам производительности, возможно, отчасти это связано с моим непониманием с Java-сборщиком мусора.Например, в моем коде, когда я создаю document и извлекаю требуемый Elements, сработает ли сборщик мусора, что у меня больше нет операций для document, и удаляю его?

Единственный острый вопрос, который у меня остался, - это способ открыть соединение с веб-сайтом, начать очистку и вернуть первое совпадение конечному пользователю с помощью Android ListView и продолжить поиск по HTMLдокумент, а затем обновить ListView, если / когда находятся другие подходящие элементы?

...