آموزش کار با ساختار XML در اندروید (XML Parser)
جلسات دوره
مهدی عباسی
مهدی عباسی هستم، مسلط به حداقل ۲۰ زبان مطرح برنامه نویسی به صورت پیشرفته، مدیر عامل شرکت آریا نرم افزار و بنیانگذار آکادمی درسمن، مسلط به تدریس دروس تخصصی کاردانی و کارشناسی کامپیوتر، پایگاه داده ها، برنامه نویسی پیشرفته، مبانی برنامه نویسی، مباحث ویژه طراحی وب و .... مشاهده رزومه
نحوه کار با ساختار XML در اندروید
در این جلسه نحوه آموزش کار با ساختار XML در اندروید را بررسی میکنیم. در دوره قبل گفتیم برای ذخیره اطلاعات (موجودیتها) در سطح لوکال اپلیکیشنها از دیتابیس استفاده میکنیم. اما اگر قرار باشد از اطلاعات به صورت اشتراکی بین کاربران، اپلیکیشنها و یا درون شبکه استفاده کنیم، باید دیتابیس یا اطلاعات را در سطح وب انتقال دهیم.
برای دسترسی به داده در بستر وب نیاز به وب سرویسها داریم و برای انتقال اطلاعات با وب سرویسها از دو روش یا از دو فرمت JSON و XML استفاده میکنیم.
JSON روش جدیدتر و سریعتر نسبت به XML است ولی این به معنای منسوخ شدن XML نیست و هنوز بسیاری از شرکتها در حال حاضر از فرمت XML برای انتقال داده با وب سرویسها استفاده میکنند.
مثال از ساختار XML:
<a>
….
</a>
همانطور که در مثال بالا مشاهده میکنید دادهها در تگهای شروع و پایان نوشته میشوند که میتوانند از نوع رشته، عدد، بولین یا حتی تگهای تودرتو باشد.
<people>
<person>
<id>1</id>
<name>Yashar</name>
<family>Rezaei</family>
<age>18</age>
</person>
<person>
<id>2</id>
<name>Amir</name>
<family>Ahmadi</family>
<age>35</age>
</person>
</people>
در بالا مثالی از تگهای تودرتو در فرمت XML مشاهده میکنید.
تا اینجا با ساختار XML آشنا شدیم و در ادامه با نحوه خواندن و پردازش (pars) XML و تبدیل به آبجکت در اندروید آشنا میشویم.
برای شروع نیاز به یک فایل XML داریم. یک فایل با پسوند XML در پوشه assets قرار دادیم که حاوی اطلاعات زیر است:
<?xml version="1.0" encoding="UTF-8"?>
<people>
<person>
<id>1</id>
<name>mehdi</name>
<family>abbasi</family>
</person>
<person>
<id>2</id>
<name>ali</name>
<family>rezaie</family>
</person>
<person>
<id>3</id>
<name>ahmad</name>
<family>javadi</family>
</person>
</people>
سپس یک کلاس model به نام person میسازیم که حاوی اطلاعات زیر است:
public class Person
{
private int Id;
private String Name;
private String Family;
public Person()
{
}
public Person(int id, String name, String family)
{
Id = id;
Name = name;
Family = family;
}
public int getId()
{
return Id;
}
public void setId(int id)
{
Id = id;
}
public String getName()
{
return Name;
}
public void setName(String name)
{
Name = name;
}
public String getFamily()
{
return Family;
}
public void setFamily(String family)
{
Family = family;
}
@Override
public String toString()
{
return Id+"\t"+Name+"\t"+Family+"\n";
}
}
با استفاده از تابع زیر فایل XML درون پوشه Assets را باز کردیم و درون متغیر inputStream نگهداری کردیم.
InputStream inputStream = OpenXmlFile();
private InputStream OpenXmlFile()
{
InputStream inputStream=null;
try
{
inputStream= getAssets().open("xmlfile1.xml");
} catch (IOException e)
{
e.printStackTrace();
}
return inputStream;
}
سپس یک تابع برای پردازش فایل XML با نام MyXmLPullParser ساختیم که ورودی تابع از نوع InputStream است و خروجی تابع لیستی از نوع Person که حاوی اطلاعات زیر است:
private ArrayList<Person> MyXmlPullParser(InputStream inputStream)
{
ArrayList<Person> list1 = new ArrayList<>();
Person person=null;
try
{
XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = parserFactory.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(inputStream, null);
String tag = "", text = "";
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT)
{
tag = parser.getName();
switch (event)
{
case XmlPullParser.START_TAG:
if (tag.equals("person"))
{
person = new Person();
}
break;
case XmlPullParser.TEXT:
text = parser.getText();
break;
case XmlPullParser.END_TAG:
switch (tag)
{
case "id":
person.setId(Integer.parseInt(text));
break;
case "name":
person.setName(text);
break;
case "family":
person.setFamily(text);
break;
case "person":
if (person != null)
list1.add(person);
break;
}
break;
}
event = parser.next();
}
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
return list1;
}
در بالای تابع یک لیست از person به نام list1 ساختیم و همچنین یک شی از کلاس Person به نام person ساختیم که قرار است ابتدا دادههای XML را به شی person تبدیل کرده، سپس آن را به list1 اضافه کنیم و به عنوان خروجی تابع ارسال کنیم.
در ادامه یک شی از کلاس XmlPullParserFactory و XmlPullParser ساختیم و با کمک تابع setInput اطلاعات فایل XML که درون InputStream نگهداری کردیم را به parser دادیم.
حالا یک متغیر رشتهای با نام tag برای نگهداری اسم تگ و متغیر text برای نگهداری مقدار تگ داریم. سپس یک حلقه گذاشتیم و گفتیم تا زمانی که به آخر XML نرسیده، تکرار شود و در هر سری با استفاده از متغیر event و switch case بررسی کردیم و عملیات لازم را انجام دادیم.
در مرحله END_TAG با استفاده از دو متغیر tag و switch case بررسی کردیم که در پایان کدام تگ هستیم.
بر اساس نوع داده تعیین شده، person را مقداردهی کردیم، اگر به تگ پایانی person برسیم آنرا به list1 اضافه میکنیم.
تا اینجا ما توانستیم فایل XML را به لیستی از person تبدیل کنیم. در ادامه برای نمایش لیست person در خروجی، یک تابع به نام ShowPersonList ساختیم که یک لیست به عنوان ورودی میگیرد و اطلاعات لیست person را درون متغیر رشته میچسباند و آن رشته را درون textView نمایش میدهد.
کد کامل کلاس MainActivity
package com.darsman.myxmlparser1;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity
{
TextView txt1;
Person person;
ArrayList<Person> personList = new ArrayList<Person>();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SetupView();
InputStream inputStream = OpenXmlFile();
Toast.makeText(this, ""+personList.size(), Toast.LENGTH_SHORT).show();
if (inputStream != null)
{
personList = MyXmlPullParser(inputStream);
ShowPersonList(personList);
}
}
private void SetupView()
{
txt1 = findViewById(R.id.txt1);
}
private InputStream OpenXmlFile()
{
InputStream inputStream=null;
try
{
inputStream= getAssets().open("xmlfile1.xml");
} catch (IOException e)
{
e.printStackTrace();
}
return inputStream;
}
private ArrayList<Person> MyXmlPullParser(InputStream inputStream)
{
ArrayList<Person> list1 = new ArrayList<>();
Person person=null;
try
{
XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = parserFactory.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(inputStream, null);
String tag = "", text = "";
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT)
{
tag = parser.getName();
switch (event)
{
case XmlPullParser.START_TAG:
if (tag.equals("person"))
{
person = new Person();
}
break;
case XmlPullParser.TEXT:
text = parser.getText();
break;
case XmlPullParser.END_TAG:
switch (tag)
{
case "id":
person.setId(Integer.parseInt(text));
break;
case "name":
person.setName(text);
break;
case "family":
person.setFamily(text);
break;
case "person":
if (person != null)
list1.add(person);
break;
}
break;
}
event = parser.next();
}
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
return list1;
}
private void ShowPersonList(ArrayList<Person> personList)
{
String temp="";
for (Person person:personList){
temp+=person.getId()+" "+person.getName()+" "+person.getFamily()+"\n";
}
txt1.setText(temp);
}
}
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.