JSON, XML, Rest služby
XML
Hlavnou výhodou načítavania údajov z formátu XML je univerzálnosť a multiplatformovosť. Na parsovanie údajov podporuje Android DOM (Document Object Model) alebo XMLPullParser.
XMLPullParser
Použitie objektu XMLPullParser je oproti technológií DOM jednoduchšie a efektívnejšie. Na zistenie typu objektu využíva XMLPullParser metódu getEventType(), ktorá môže mať nasledujúce hodnoty:
- 0 - START_DOCUMENT (zač. stav parseru),
- 2 - START_TAG (počiatočný TAG XML elementu),
- 4 - TEXT (textový obsah elementu, hodnota sa načíta pomocou getText()),
- 3 - END_TAG (koncový tag XML dokukemntu),
- 1 - END_DOCUMENT (koniec dokumentu)
Príklad XMLPullParser – kroky pri čítaní z dokumentu XML
0,2,4,2,4,2,4,3,4,2,4,3,4,3,4,3,4,1
<?xml version="1.0" encoding="utf-8"?>
0
2<auta>4
2<auto>4
2<id>41 3</id>4
2<znacka>4Nissan 3</znacka>4
2<model>4Juke 3</model>4
3</auto>4
3</auta>1
Príklad – aplikácia, ktorá bude čítať data z XML súboru (uloženého v RES->RAW ). Dáta uloží do listu.
Na začiatku si musíme vytvoriť nový adresár (raw folder):
New --> “Android resource directory” --> raw folder
Následne do tohto adresára pridáme XML súbor
New --> File
RES->RAW->auta_data.xml
<?xml version="1.0" encoding="utf-8"?>
<auta>
<auto>
<id>1</id>
<znacka>Nissan</znacka>
<model>Juke</model>
</auto>
<auto>
<id>2</id>
<znacka>Suzuki</znacka>
<model>sx4</model>
</auto>
<auto>
<id>3</id>
<znacka>Suzuki</znacka>
<model>Vitara</model>
</auto>
<auto>
<id>4</id>
<znacka>Honda</znacka>
<model>CR-V</model>
</auto>
<auto>
<id>5</id>
<znacka>Honda</znacka>
<model>HR-V</model>
</auto>
</auta>
activity_main.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:id="@+id/activity_auta"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="p_v.myapplication.MainActivity">
<TextView
android:id="@+id/nadpis"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="Zoznam áut" />
<ListView
android:id="@+id/listZoznamAut"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/nadpis" />
</RelativeLayout>
list_item.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
Auta.java
public class Auta {
private String id;
private String znacka;
private String model;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getZnacka() {
return znacka;
}
public void setZnacka(String znacka) {
this.znacka = znacka;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
@Override
public String toString() {
return znacka + "\n" + model;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listZoznamAut);
XMLParser parser = new XMLParser();
List<Auta> list_auta = parser.parse(getResources().openRawResource(R.raw.auta_data));
//list_auta = parser.parse(getAssets().open("auta_data.xml"));
ArrayAdapter<Auta> adapter = new ArrayAdapter<Auta>(this, R.layout.list_item, list_auta);
listView.setAdapter(adapter);
}
}
XMLParser.java
public class XMLParser {
List<Auta> list_auta;
private Auta auta;
private String text;
public XMLParser() {
list_auta = new ArrayList<Auta>();
}
public List<Auta> vypisAuta() {
return list_auta;
}
public List<Auta> parse(InputStream is) {
try {
//vytvorenie implementácie XML Pull Parser
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//nastavíme podporu XML namespace
factory.setNamespaceAware(true);
/*objekt XMLPullParser je oproti DOM jednoduchší a efektívnejší
XMLPullParser interface vytvorí novú inštanciu XML Pul Parsera */
XmlPullParser parser = factory.newPullParser();
//nastaví input stream
parser.setInput(is, null);
/*
* metóda getEventTyp() vracia typ objektu, ktorý parser aktuálne prechádza
* hodnoty:
* 0 - START_DOCUMENT (zač. stav parseru),
* 2 - START_TAG (počiatočný TAG XML elementu),
* 4 - TEXT (textový obsah elementu, hodnota sa načíta pomocou getText()),
* 3 - END_TAG (koncový tag XML dokukemntu),
* 1 - END_DOCUMENT (koniec dokumentu)
* Parser bude v cykle prechádzať medzi krokmi najprv krok:
* 0 - začiatok XML súboru null
* 2 - TAG name <auta>
* 4 - či je za TAG name <auta> nejaký text = nie je
* 2 - TAG <auto> , vytvorí new Auto
* 4 - null
* 2 - TAG name <id>
* 4 - či je za <id> nejaký text, áno je číslo napr. 1, uloží do premennej text
* 3 - ukončovací tag <id> , ak je to id, tak nastav setID
* 4 - null
* 2 - TAG name <znacka>
* 4 - text napr. Nissan, uloží text
* 3 - setZnacka()
*/
int typ = parser.getEventType();
while (typ != XmlPullParser.END_DOCUMENT) {
//zistí sa názov XML TAG
String tagname = parser.getName();
switch (typ) {
//ak je začínajúci TAG "auto", inak choď na ďalší krok TAG - v tomto kroku ignoruj tagy id, znacka, model
case XmlPullParser.START_TAG:
if (tagname.equalsIgnoreCase("auto")) {
auta = new Auta();
}
break;
//ak sme v kroku TEXT a obsahuje nejaký text, tak ho ulož a pokročuj na ďalšom kroku (next()) - END_TAG
case XmlPullParser.TEXT:
text = parser.getText();
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase("auto")) {
list_auta.add(auta);
} else if (tagname.equalsIgnoreCase("id")) {
auta.setId(text);
} else if (tagname.equalsIgnoreCase("znacka")) {
auta.setZnacka(text);
} else if (tagname.equalsIgnoreCase("model")) {
auta.setModel(text);
}
break;
default:
break;
}
//next() - posun na ďalší objekt
typ = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list_auta;
}
}