SELECT * FROM Vzakladke.net

Статьи об автоматизации и программировании

XMLPullParser example on Android

 

 

XmlPullParser – XML-парсер, который можно использовать для разбора XML документа. Принцип его работы заключается в том, что он пробегает весь документ, останавливаясь на его элементах. Но пробегает он не сам, а с помощью метода next. Мы постоянно вызываем метод next и с помощью метода getEventTypeпроверяем, на каком элементе парсер остановился.

Каждый новый тег — это некое «событие», в зависимости от типа которого мы можем понять, с чем имеем дело - основные элементы, которые отлавливает парсер:

START_DOCUMENT – начало документа

START_TAG – начало тэга

TEXT – содержимое элемента

END_TAG – конец тэга

END_DOCUMENT – конец документа

 

 

Создадим в начале лэйаут main.xml 

<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: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=".XMLPullParserActivity" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="@string/hello_world"
        android:textColor="#CC0033"
        android:textSize="16sp" />
 
    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@id/text" />    

</RelativeLayout>

 

и к нему лэйаут для отдельного элемента list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<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" />

 

 

В папке assets необходимо создать файл с именем employees.xml

<?xml version="1.0" encoding="UTF-8"?>
<employees>
    <employee rel="face">
        <id>1</id>
        <name>Dave</name>
        <department>Manager</department>
        <type>Chief</type>      
        <email>manager@asksql.org</email>
        </employee>
    <employee rel="person">
        <id>2</id>
        <name>James</name>
        <department>Saller</department>
        <type>Support</type>       
        <email>mail@asksql.org</email>
        </employee>   
    <employee rel="man">
        <id>3</id>
        <name>Tom</name>
        <department>Testing</department>
        <type>Support</type>      
        <email>no-reply@asksql.org</email>
        </employee>
</employees> 

 

Главное активити назовем MainActivity

 

import java.io.IOException;
import java.util.List;
import com.ndler.xmlpullparserhandler.Employee;
import com.ndler.xmlpullparserhandler.XMLPullParserHandler;
import android.os.Bundle;
import android.app.Activity;

import android.widget.ArrayAdapter;
import android.widget.ListView;

//import android.view.Menu; 

public class MainActivity extends Activity {
 
    ListView listView; 
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        listView = (ListView) findViewById(R.id.list);
         
        List<Employee> employees = null;
        try {
            XMLPullParserHandler parser = new XMLPullParserHandler();
            employees = parser.parse(getAssets().open("employees.xml"));
            ArrayAdapter<Employee> adapter = 
                new ArrayAdapter<Employee>(this,R.layout.list_item, employees);
            listView.setAdapter(adapter);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
 /* меню нам отображать не обязательно:
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 */
}

 

Еще, как вариант, наш адаптер можно было переписать так, не создавая XML файла для отдельного элемента list_item.xml:

	        List<Employee> employees = null;
	        try {
	            XmlPullParserHandler parser = new XmlPullParserHandler();
	            InputStream is=getAssets().open("employees.xml");
	            employees = parser.parse(is);
	            
	            ArrayAdapter<Employee> adapter = new ArrayAdapter<Employee>(this,android.R.layout.simple_list_item_1, employees);
	            listView.setAdapter(adapter);
	            
	        } catch (IOException e) {e.printStackTrace();}	

 

 

Создадим обработчик XMLPullParserHandler

 

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
 
// import org.asksql.xmlpullparserhandler.Employee;
 
public class XMLPullParserHandler {
    List<Employee> employees;
    private Employee employee;
    private String text;
 
    public XMLPullParserHandler() {
        employees = new ArrayList<Employee>();
    }
 
    public List<Employee> getEmployees() {
        return employees;
    }
 
    public List<Employee> parse(InputStream is) {
        XmlPullParserFactory factory = null;
        XmlPullParser parser = null;
        try {
            factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            parser = factory.newPullParser();
 
            parser.setInput(is, null);
 
            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tagname = parser.getName();
                switch (eventType) {
                case XmlPullParser.START_TAG:
                    if (tagname.equalsIgnoreCase("employee")) {
                        // create a new instance of employee
                        employee = new Employee();
                    }
                    break;
 
                case XmlPullParser.TEXT:
                    text = parser.getText();
                    break;
 
                case XmlPullParser.END_TAG:
                    if (tagname.equalsIgnoreCase("employee")) {
                        // add employee object to list
                        employees.add(employee);
                    } else if (tagname.equalsIgnoreCase("name")) {
                        employee.setName(text);
                    } else if (tagname.equalsIgnoreCase("id")) {
                        employee.setId(Integer.parseInt(text));
                    } else if (tagname.equalsIgnoreCase("department")) {
                        employee.setDepartment(text);
                    } else if (tagname.equalsIgnoreCase("email")) {
                        employee.setEmail(text);
                    } else if (tagname.equalsIgnoreCase("type")) {
                        employee.setType(text);
                    }
                    break;
 
                default:
                    break;
                }
                eventType = parser.next();
            }
 
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        return employees;
    }
}

 

 

И создаем класс Employee для работы с переменными

 

package org.asksql.xmlpullparserhandler;

public class Employee {
	 
    private String name;
    private int id;
    private String department;
    private String type;
    private String email;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getDepartment() {
        return department;
    }
 
    public void setDepartment(String department) {
        this.department = department;
    }
 
    public String getType() {
        return type;
    }
 
    public void setType(String type) {
        this.type = type;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    @Override
    public String toString() {
        return id + ": " + name + "\n" + department + "-" + type
                + "\n" + email;
    }
}

 

 

Дата публикации: 2015-06-10 10:33:26

JAVA, Android

0

Отзывы:

Ваше имя:

Ваш e-mail (необязательно):

Сообщение:

Captcha