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;

    }
}

 Program je možné stiahnuť tu.