Структура и представление HTML документа

Если загрузить HTML документ в веб-браузер, то можно будет увидеть древовидную структуру этого документа:

Структура и представление HTML документа - student2.ru

Представление HTML-документа в виде древовидной структуры

Структура и представление HTML документа - student2.ru

Jsoupпозволяет быстро и эффективно извлекать элементы из DOM–структуры, использую селекторы CSS.

Под содержимым понимается все, что может находиться на веб-странице: рисунки, ссылки, абзацы, текст и т. д. Это обеспечивает унифицированный способ навигации по документу.

Следует заметить, что DOM может применяться не только в веб-страницах, но и к любым других документам. В частности, она может использоваться с любыми словарями XML, причем одним из таких словарей является HTML, а точнее, XHTML.

DOM является развивающимся стандартом и разбит на три уровня. Первый уровень является первой версией стандарта и пока что единственной законченной. Он состоит из двух разделов: первый является ядром и определяет принципы манипуляции со структурой документа (генерация и навигация), а второй посвящен представлению в DOM элементов HTML, определяемых одноименными тегами.

Второй и третий уровни описывают модель событий, дополняют таблицы стилей, проходы по структуре.

Глава III. Практическая часть.

Реализация.

Src/androidTest/main/assets/java/com.2210.alive.maidailyscheduller

DetailActivity

packagecom.a2210.alive.mydailyscheduller;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.support.v4.app.FragmentActivity;
importandroid.support.v4.app.FragmentManager;
importandroid.support.v4.view.ViewPager;
public classDetailActivity extendsFragmentActivity {
String day;
publicString chosenGroup;
ViewPager pager;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
Intent intent = getIntent();
day = intent.getStringExtra("CHOISE_DAY");

/** получаемпереданныйдееньнеделииз mainActivity **/
chosenGroup = intent.getStringExtra("GROUPE");

/** получаемпереданныйномергруппыиз mainActivity **/
Bundle bundle = newBundle();
bundle.putString("CHOSEN_GROUP", chosenGroup); /** передаемномергруппывофрагменты **/
pager = (ViewPager) findViewById(R.id.pager);/** определяем ViewerPager**/
FragmentManager fm = getSupportFragmentManager();
MyAdapter myAdapter = newMyAdapter(fm, bundle);
myAdapter.notifyDataSetChanged();
pager.setAdapter(myAdapter);/** наполняем ViewerPager**/
pager.setCurrentItem(currPosition(day)); /** переходимпонужнойпозициипринажатииднянеделив mainActivity**/
}
/** функциядляопределениятекущейпозицииподнюнедели ViewerPager**/
public intcurrPosition(String day) {
intcurrPos = 0;
switch(day) {
case "Понедельник":
currPos = 0;
break;
case "Вторник":
currPos = 1;
break;
case "Среда":
currPos = 2;
break;
case "Четверг":
currPos = 3;
break;
case "Пятница":
currPos = 4;
break;
case "Суббота":
currPos = 5;
break;
}
returncurrPos;
}

}

Monday

packagecom.a2210.alive.mydailyscheduller;
importandroid.content.Context;
importandroid.os.AsyncTask;
importandroid.os.Bundle;
importandroid.support.annotation.Nullable;
importandroid.support.v4.app.Fragment;
importandroid.support.v4.app.ListFragment;
importandroid.util.Log;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ArrayAdapter;
importandroid.widget.ListAdapter;
importorg.jsoup.Jsoup;
importorg.jsoup.nodes.Element;
importorg.jsoup.select.Elements;
importjava.util.ArrayList;
import staticcom.a2210.alive.mydailyscheduller.R.layout.item;

/**
* A simple {@linkFragment} subclass.
*/
public classMonday extendsListFragment {
String groupNum;
publicMonday() {
}
@Override
public voidonAttach(Context context) {
super.onAttach(context);
}
@Override
public voidonCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
groupNum= bundle.getString("CHOSEN_GROUP");

/** извлекаемпереданныйномергруппы **/
}
@Override
publicView onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
newNewThread().execute(); /**запускаемпоток **/
returninflater.inflate(R.layout.fragment_monday, container, false);
}
classNewThread extendsAsyncTask<String,Void,ArrayList<String>> {
@Override
protected voidonPostExecute(ArrayList<String> strings) {
super.onPostExecute(strings);
ArrayAdapter<String> arrayAdapter = newArrayAdapter<String>(getActivity(),R.layout.item, R.id.item_of_sched,strings);
setListAdapter(arrayAdapter);

/**послеобновлениязаполняемсписковыйфрагментданными **/
}
@Override
protectedArrayList<String> doInBackground(String... params) {
MyData data = newMyData();
ArrayList<String> my = data.listDay("Понедельник",groupNum);

/** получаеммассиврассписаниянапонедельниквпотоке **/
returnmy;
}
}
}

MainActivity

packagecom.a2210.alive.mydailyscheduller;
importandroid.content.Intent;
importandroid.graphics.Color;
importandroid.graphics.drawable.ColorDrawable;
importandroid.os.Bundle;
importandroid.support.v7.app.AppCompatActivity;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.View;
importandroid.widget.AdapterView;
importandroid.widget.ArrayAdapter;
importandroid.widget.ListView;

public classMainActivity extendsAppCompatActivity {
String[] days;
String[] groups;
ListView myList;
String chosenGroup;
boolean flag= false;
@Override
public booleanonCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public booleanonOptionsItemSelected(MenuItem item) {
Intent intent = newIntent(this, SelectGroup.class);

/** переходимвактивитидлявыборагруппы **/
startActivity(intent);
return super.onOptionsItemSelected(item);
}
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null) {
chosenGroup= savedInstanceState.getString("CHOSEN_GROUPE"); /**извлекаемсохраненныеданныееслиониестьпослеобновленияактивити**/
flag= savedInstanceState.getBoolean("FLAG");
}
myList= (ListView) findViewById(R.id.li);
groups= getResources().getStringArray(R.array.groups); /**массивгруппизресурсовстрок**/
Intent intent = getIntent();/**получаеминтент **/
chosenGroup= intent.getStringExtra("MY_GROUP");/** извлекаемизинтентапереданнуюгуппу**/
for(String group : groups)

{ /**проверкасодержитсялигруппавмассивегрупп**/
if(group.equals(chosenGroup)) {
flag= true;
break;
}else{flag= false;}
}
if(!flag){chosenGroup= "06630";}/**еслинесодержитсятовыводимсвою **/
days= getResources().getStringArray(R.array.days_of_week); /**получаеммассивстрокизресурса strings**/
ArrayAdapter<String> adapter = newArrayAdapter<String>(this, R.layout.day_item, R.id.days_item,days);/**создаемадаптердлянаполнения Listview формируемиз TextView имассивастрок**/
myList.setAdapter(adapter);/**устанавливаемадаптер**/
myList.setOnItemClickListener(newAdapterView.OnItemClickListener() {
/**устанавливаемслушателянажатиенаэлементсписка**/
@Override
public voidonItemClick(AdapterView<?> parent, View view, intposition, longid) {/**методобработкинажатиянаэлсписка**/
Intent intent = newIntent(getApplicationContext(), DetailActivity.class); /**создаеминтентдляпереходавдругойактивити **/
intent.putExtra("CHOISE_DAY", days[position]); /**передаемназваниевдетеилактивитинажатогоэлементасписка**/
intent.putExtra("GROUPE", chosenGroup);/**передаемномергруппы **/
startActivity(intent);
}
});
}
@Override
protected voidonSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("CHOSEN_GROUPE", chosenGroup); /**сохраняемзначениядляобновленияактивити **/
outState.putBoolean("FLAG", flag);
}
}

MyAdapter

packagecom.a2210.alive.mydailyscheduller;
importandroid.os.Bundle;
importandroid.support.v4.app.Fragment;
importandroid.support.v4.app.FragmentManager;
importandroid.support.v4.app.FragmentPagerAdapter;

/** Классадаптердлянаполнения ViewerPager */
public classMyAdapter extendsFragmentPagerAdapter {

final int pagesCount= 6;
privateBundle bundle;
Monday monday;
Tuesday tuesday;
Wednesday wednesday;
Thursday thursday;
Friday friday;
Saturday saturday;//private final Bundle fragmentBundle;
publicMyAdapter(FragmentManager fm, Bundle data) {
super(fm);
bundle= data; /** добавляембандлвконструктордляпередачиномерагруппывофрагмент**/
}
@Override
publicCharSequence getPageTitle(intposition) {
/** добавилизаголовкиднейнеделив ViewerPager **/
String title;
switch(position) {
case0:
title = "Понедельник";
returntitle;
case1:
title = "Вторник";
returntitle;
case2:
title = "Среда";
returntitle;
case3:
title = "Четверг";
returntitle;
case4:
title = "Пятница";
returntitle;
case5:
title = "Суббота";
returntitle;
}
return null;
}
@Override
public intgetCount() {
return pagesCount;
}
@Override
publicFragment getItem(intposition) {
/** создаемфрагменты**/
monday= newMonday();
tuesday= newTuesday();
wednesday= newWednesday();
thursday= newThursday();
friday= newFriday();
saturday= newSaturday();
/** возращаемфрагментприполучениипозиции ViewerPager**/
switch(position) {
case0:
bundle.putInt("currPage", position++);
monday.setArguments(bundle);
return monday;
case1:
bundle.putInt("currPage", position++);
tuesday.setArguments(bundle);
return tuesday;
case2:
bundle.putInt("currPage", position++);
wednesday.setArguments(bundle);
return wednesday;
case3:
bundle.putInt("currPage", position++);
thursday.setArguments(bundle);
return thursday;
case4:
bundle.putInt("currPage", position++);
friday.setArguments(bundle);
return friday;
case5:
bundle.putInt("currPage", position++);
saturday.setArguments(bundle);
return saturday;
}
return null;
}
}

MyData

packagecom.a2210.alive.mydailyscheduller;
importandroid.os.AsyncTask;
importorg.jsoup.Jsoup;
importorg.jsoup.nodes.Element;
importorg.jsoup.select.Elements;

importjava.util.ArrayList;
/**функцияполученияспискарассписанияприполученииднянеделииномерагруппы*/

public classMyData {
privateArrayList<String>my= newArrayList<>();
privateString d, w, t, s, st, n, a;
privateString scheduler;

publicArrayList<String> listDay(finalString dayOfWeek, finalString groupeNum ) {
try{
org.jsoup.nodes.Document doc = Jsoup.connect("http://bsu.ru/rasp/?g="+groupeNum).get(); /**получаемданныеметодом GET**/
Elements elements = doc.select("div.week"); /**разбиваемпонеделям**/
for(Element element : elements) {
Elements el = element.select("table.rasp_week");
for(Element element1 : el) {
Elements elements1 = element1.select("td");
for(Element element2 : elements1) {

Elements day = element2.select("h3.rasp_day"); /**получаемдень**/
for(Element element3 : day) {
d= element3.text();
}
Elements time = element2.select("td.rasp_time"); /**получаемвремя**/
for(Element element3 : time) {
t= element3.text();
}
Elements subj = element2.select("td.rasp_subj"); /**получаемпредмет**/
for(Element element3 : subj) {
s= element3.text();
}
Elements type = element2.select("td.rasp_subj_type"); /**получаемтип**/
for(Element element3 : type) {
st= element3.text();
}
Elements aud = element2.select("td.rasp_aud"); /**получаемномераудитории**/
for(Element element3 : aud) {
a= element3.text();
}
Elements week = el.select("table.rasp_week").prev(); **получаемномернедели**/
for(Element element3 : week) {
w= element3.text();
}
Elements name = element2.select("td.rasp_aud").next(); /**следующийэлементпосленомерааудитории - имяпреподователя**/
for(Element element3 : name) {
n= element3.text();
/**еслиденьнеделисовподаеттовывеститоформируемсписок**/
if(dayOfWeek.equals(d)) {
scheduler= w+ "\r\n"+
"Время: "+ t+ "\r\n"+ "Названиепредмета: "+ s+ "\r\n"+ "Типпары: "+ st+
" Аудитория: "+ a+ "\r\n"+ "Имяпреподавателя: "+ n+ "\r\n\r";
my.add(scheduler); /**добовляемстрокувсписокстрок **/
}
}
}
}
}
} catch(Exception e) {
e.printStackTrace();
}
return my;
}
}

SelectGroup

packagecom.a2210.alive.mydailyscheduller;
importandroid.content.Intent;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.view.View;
importandroid.widget.ArrayAdapter;
importandroid.widget.AutoCompleteTextView;
importandroid.widget.Button;
public classSelectGroup extendsAppCompatActivity {
String[] groups;
AutoCompleteTextView auto;
Button submit;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_group);
groups= getResources().getStringArray(R.array.groups); /** создаеммассивгрупп**/
auto= (AutoCompleteTextView) findViewById(R.id.autocomplite_item_groupe); /** определяем AutoCompleteTextView**/
auto.setAdapter(newArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,groups));/** запоняем AutoCompleteTextView **/
submit= (Button) findViewById(R.id.submit);/**определяемкнопку **/
submit.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View v) {
String id = null;
id = auto.getText().toString();/**получаемвыбранноезначениегруппы**/
Intent intent = newIntent(getApplication(), MainActivity.class);
intent.putExtra("MY_GROUP",id);/**передаемвыбранноезначениегруппыв mainActivity**/
startActivity(intent);
}
});
}
}

TextViewPlus

packagecom.a2210.alive.mydailyscheduller;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Typeface;
importandroid.util.AttributeSet;
importandroid.util.Log;
importandroid.widget.TextView;

public classTextViewPlus extendsandroid.support.v7.widget.AppCompatTextView {
private static finalString TAG = "TextView";
publicTextViewPlus(Context context) {
super(context);
}
publicTextViewPlus(Context context, AttributeSet attrs) {
super(context, attrs);
setCustomFont(context, attrs);
}
publicTextViewPlus(Context context, AttributeSet attrs, intdefStyle) {
super(context, attrs, defStyle);
setCustomFont(context, attrs);
}
private voidsetCustomFont(Context ctx, AttributeSet attrs) {
TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);/**получаеминформациюостилизированныхатрибутах**/
String customFont = a.getString(R.styleable.TextViewPlus_customFont); /**возвращаемстроковоезначениедляатрибута**/
setCustomFont(ctx, customFont); /**передаемназвание **/
a.recycle(); /**освобождаемресурсы**/
}
public booleansetCustomFont(Context ctx, String asset) {
Typeface tf = null;
try{
tf = Typeface.createFromAsset(ctx.getAssets(), asset);/**создаемновыйшрифтизуказанного **/
} catch(Exception e) {
Log.e(TAG, "Could not get typeface: "+e.getMessage()); /**выводлогаошибки**/
return false;
}
setTypeface(tf); /**устанавливаемсозданныйшрифт**/
return true;
}

}

Res /drawable / layout / activity_detail.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@color/background"
tools:context="com.a2210.alive.mydailyscheduller.DetailActivity">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.PagerTabStrip
android:id="@+id/pagerTabStrip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:textSize="18sp"
android:textColor="@color/text"/>
</android.support.v4.view.ViewPager>
</LinearLayout>

Res /drawable / layout / activity_main.xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@color/background"
tools:context="com.a2210.alive.mydailyscheduller.MainActivity">

<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background"
android:dividerHeight="@dimen/divider"
android:divider="@color/colorPrimary"
android:id="@+id/li"/>
</LinearLayout>

Res /drawable / layout / activity_select_group.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background"
tools:context="com.a2210.alive.mydailyscheduller.SelectGroup">
<AutoCompleteTextView
android:id="@+id/autocomplite_item_groupe"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_centerHorizontal="true"
android:layout_marginTop="60dp"
android:textColor="@color/text"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/submit"
android:text="@string/submit"
android:layout_below="@+id/autocomplite_item_groupe"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:textColor="@color/text"
android:background="@color/colorPrimary"/>
</RelativeLayout>

Res /drawable / layout / day_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:foo="http://schemas.android.com/apk/res/com.a2210.alive.mydailyscheduller"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.a2210.alive.mydailyscheduller.TextViewPlus
android:layout_width="match_parent"
android:layout_height="60dp"
android:id="@+id/days_item"
android:textColor="@color/text"
android:textSize="30sp"
android:textStyle="italic"
android:gravity="center_horizontal"
foo:customFont="vivaldi_script.ttf"
/>
</LinearLayout>

Наши рекомендации