Search code examples
androidparsingxmlpullparser

Android Studio XmlPullParser parsing multiply nested elements


My XML file is something like this:

<Items>
    <Nested_item>
        <id>1</id>
        <name>nested</name>
        <description>
            <desc_item>1</desc_item>
            <desc_item>2</desc_item>
            <desc_item>3</desc_item>
        </description>
     </Nested_item>
     <Nested_item>
        <id>2</id>
        <name>nested2</name>
        <description>
            <desc_item>1</desc_item>
            <desc_item>2</desc_item>
            <desc_item>3</desc_item>
        </description>
     </Nested_item>
     <Nested_item>
        <id>3</id>
        <name>nested3</name>
        <description>
            <desc_item>1</desc_item>
            <desc_item>2</desc_item>
            <desc_item>3</desc_item>
        </description>
     </Nested_item>
</Items>

and I have class Items with atributes which I've putted into ArrayList, I've managed to parse all atributes except desc_item (which I need as ArrayList for every Item object). How can I tell parser to take only third item, for example, and to get those desc_item values as String?


Solution

  • I found solution to my problem, i have parsed inner data and after that i have parsed particular data:

    private ArrayList<Proizvod> parseXML (XmlPullParser parser) throws XmlPullParserException, IOException {
    
        ArrayList<Proizvod> proizvodLista = null;
        int eventType = parser.getEventType();
        Proizvod proizvod = null;
    
        while(eventType != XmlPullParser.END_DOCUMENT){
    
            String name;
            switch (eventType){
                case XmlPullParser.START_DOCUMENT:
                    proizvodLista = new ArrayList<Proizvod>();
                    break;
                case XmlPullParser.START_TAG:
                    name = parser.getName();
                    //System.out.println(name);
                    if(name.equals("Proizvod")){
                        proizvod = new Proizvod();
                        proizvod.setId(parser.getAttributeValue(null, "id"));
                    }else if(proizvod != null){
                        if(name.equalsIgnoreCase("ime_proizvoda")){
                            proizvod.setIme_proizvoda(parser.nextText());
                        }else if(name.equalsIgnoreCase("vrsta_proizvoda")){
                            proizvod.setVrsta_proizvoda(parser.nextText());
                        }else if(name.equalsIgnoreCase("merna_jedinica")){
                            proizvod.setVrsta_proizvoda(parser.nextText());
                        }else if(name.equalsIgnoreCase("Prodavnice")){
                            proizvod.setLista_prodavnica(parsing(parser));
                        }
                    }
                    break;
                case XmlPullParser.END_TAG:
                    name = parser.getName();
                    if(name.equalsIgnoreCase("proizvod")&& proizvod !=null){
                        proizvodLista.add(proizvod);
                    }
            }
            eventType = parser.next();
        }
        return proizvodLista;
    }
    
    private ArrayList<String> parsing (XmlPullParser parser) throws XmlPullParserException, IOException {
        String print = null;
        int eventType = parser.getEventType();
        ArrayList<String> lista = new ArrayList<String>();
        while(eventType != XmlPullParser.END_DOCUMENT){
            String name = parser.getName();
            if(name.equalsIgnoreCase("Prodavnice")){break;}
            else{
                if(eventType==XmlPullParser.START_TAG){
                    print = parser.nextText();
                    lista.add(print);
                    System.out.println(print);
                }
            }
            eventType = parser.next();
        }
    
        return lista;
    }
    

    And my XML looks like this:

    <?xml version="1.0" encoding="utf-8"?>
    <Proizvodi>
    <Proizvod id="1">
        <ime_proizvoda>Mleko</ime_proizvoda>
        <vrsta_proizvoda>mlecni proizvod</vrsta_proizvoda>
        <merna_jedinica>litar</merna_jedinica>
        <Prodavnice>
            <Prodavnica>1</Prodavnica>
            <Prodavnica>3</Prodavnica>
            <Prodavnica>4</Prodavnica>
        </Prodavnice>
    </Proizvod>
    <Proizvod id="2">
        <ime_proizvoda>Hleb</ime_proizvoda>
        <vrsta_proizvoda>Pekarski proizvod</vrsta_proizvoda>
        <merna_jedinica>gram</merna_jedinica>
        <Prodavnice>
            <Prodavnica>1</Prodavnica>
            <Prodavnica>2</Prodavnica>
            <Prodavnica>3</Prodavnica>
        </Prodavnice>
    </Proizvod>
    <Proizvod id="3">
        <ime_proizvoda>Suvi vrat</ime_proizvoda>
        <vrsta_proizvoda>Mesna preradjevina</vrsta_proizvoda>
        <merna_jedinica>gram</merna_jedinica>
        <Prodavnice>
            <Prodavnica>2</Prodavnica>
            <Prodavnica>3</Prodavnica>
            <Prodavnica>4</Prodavnica>
        </Prodavnice>
    </Proizvod>
    <Proizvod id="4">
        <ime_proizvoda>Pecenica</ime_proizvoda>
        <vrsta_proizvoda>Mesna preradjevina</vrsta_proizvoda>
        <merna_jedinica>100 grama</merna_jedinica>
        <Prodavnice>
            <Prodavnica>1</Prodavnica>
            <Prodavnica>2</Prodavnica>
            <Prodavnica>4</Prodavnica>
        </Prodavnice>
    </Proizvod>