آموزش XML Parser در اندروید
آموزش XML Parser در اندروید
XML مخفف عبارت Extensible Markup Language می باشد. XML یک فرمت خیلی معروف بوده و معمولاً برای اشتراک گذاری داده در اینترنت استفاده می شود. این فصل توضیح می دهد که چگونه فایل xml را تجزیه کرده و اطلاعات لازم را از آن استخراج کرد.
اندروید سه نوع تجزیه گر xml ارائه می دهد که عبارتند از DOM، SAX و XMLPullParser و در بین این سه اندروید XMLPullParser را پیشنهاد می دهد زیرا موثر بوده و استفاده از آن نیز آسان می باشد. بنابراین ما قرار است از XMLPullParser برای تجزیه ی xml استفاده کنیم.
اولین گام معرفی فیلدهایی در xml می باشد که مورد علاقه ی شما هستند. به عنوان مثال در xml ارائه شده در زیر ما تمایل داریم دمای هوا را به دست آوریم.
<?xml version="1.0"?>
<current>
<city id="2643743" name="London">
<coord lon="-0.12574" lat="51.50853"/>
<country>GB</country>
<sun rise="2013-10-08T06:13:56" set="2013-10-08T17:21:45"/>
</city>
<temperature value="289.54" min="289.15" max="290.15" unit="kelvin"/>
<humidity value="77" unit="%"/>
<pressure value="1025" unit="hPa"/>
</country>
XML – عناصر
یک فایل xml دارای مولفه های بسیاری می باشد. در اینجا جدولی را مشاهده می کنید که مولفه های مربوط به یک فایل xml را تعریف می کند.
-
Prolog
یک فایل xml با یک مقدمه(prolog) شروع می شود. اولین خط که شامل اطلاعاتی در مورد یک فایل است، مقدمه نامیده می شود.
-
Events
یک فایل xml دارای رویدادهای بسیاری می باشد. یک رویداد می تواند چیزی شبیه این باشد: شروع داکیومنت، پایان داکیومنت، شروع tag، پایان tag و متن و غیره.
-
Text
علاوه بر رویداد ها و tag ها، یک فایل xml دارای یک متن ساده نیز می باشد. به عنوان مثال GB یک متن در country tag می باشد.
-
Attributes
یک خصوصیات اضافه ای از یک tag هستند، مانند مقدار وغیره.
XML – تجزیه
در مرحله بعد، یک شئ XMLPullParser ایجاد خواهیم کرد اما به خاطر انجام این کار ابتدا شئ XmlPullParserFactory ایجاد کرده و سپس متد newPullParser() را فرامی خوانیم تا XMLPullParser را ایجاد کنیم. ترکیب آن در زیر ارائه شده است
private XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
private XmlPullParser myparser = xmlFactoryObject.newPullParser();
در مرحله ی بعد شامل مشخص کردن فایلی برای XmlPullParser می شود که دارای xml می باشد، که می تواند یک فایل یا یک stream با که در ان مورد یک stream است. ترکیب آن را می توانید مشاهده کنید.
myparser.setInput(stream,null);
و بالاخره آخرین مرحله تجزیه ی XML می باشد. یک فایل xml شامل رویدادها، نام و متن و AttributesValue (مقدار ویژگی ها) و غیره می باشد. بنابراین XMLPullParser دارای یک ساختار مجزا برای تجزیه ی هر فایل xml می باشد. ترکیب آن در زیر ارائه شده است.
int event = myParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT)
{
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.END_TAG:
if(name.equals("temperature")){
temperature = myParser.getAttributeValue(null,"value");
}
break;
}
event = myParser.next();
}
متد getEventType نوع رویدادی را که اتفاق می افتد بر می گرداند. به عنوان مثال شروع داکیومنت، شروع tag، و غیره. متد getName نام tag را بر می گرداند و از آنجایی که ما علاقه مند به اندازه گیری دمای هوا هستیم بناباین اگر یک tag مربوط به دما داشته باشیم، در وضعیت مشروط فقط آن را بررسی می کنیم، و متد getAttributeValue را فرا می خوانیم تا به ما مقدار tag دما را بر میگرداند .
علاوه بر این متد ها، متد های دیگری برای تجزیه ی بهتر xml توسط این کلاس ارائه می شوند که در زیر لیست آنها را می بینید
-
getAttributeCount()
این متد تعداد ویژگی های start tag موجود را بر می گرداند.
-
getAttributeName(int index)
این متد نام ویژگی مشخص شده توسط شاخص مقدار را بر می گرداند. -
getColumnNumber()
این متد تعداد گزارش های مربوط به تعداد ستون های موجود را بر می گرداند، شروع از 0. -
getDepth()
این متد آخرین عمق مربوط به عنصر را بر می گرداند. -
getLineNumber()
این متد تعداد آخرین خطوط را بر می گرداند، شروع از عدد 1. -
getNamespace()
این متد URI فضانام های مربوط به آخرین عنصر را بر می گرداند. -
getPrefix()
این متد پیشوند مربوط به عنصر موجود را بر می گرداند. -
getName()
این متد نام tag را بر می گرداند.
-
getText()
این متد متن مربوط به عنصر خاص را بر می گرداند. -
isWhitespace()
این متد بررسی می کند که آیا رویداد TEXT فعلی فقط دارای کاراکترهای فضای سفید می باشد.
مثال
در اینجا مثالی را می بینید که استفاده از کلاس MLPullParser را توضیح می دهد. این مثال یک برنامه ی آب هوایی پایه ایجاد می کند که به شما اجازه می دهد تا XML را از طریق google weather api تجزیه کنید و نتایج را نشان می دهد.
برای انجام این مثال باید آن را روی یک دستگاه واقعی یا یک emulator اجرا کنید.
-
برای ایجاد یک برنامه ی اندروید از Eclipse IDE استفاده خواهید کرد و آن را با عنوان XMLParser به عنوان بسته ی com.PRG.xmlparser نام گذاری کنید. زمان ایجاد این برنامه مطمئن شوید که Target SDK و Compile With در آخرین ورژن Android SDK هستند تا از سطوح بالاتر API استفاده کنید.
-
فایل src/MainActivity.java را برای افزودن کد لازم تغییر دهید.
-
res/layout/activity_main را برای افزودن مولفه های XML مربوطه تغییر دهید.
-
یک فایل جاوای جدید تحت src/HandleXML.java ایجاد کنید تا داده XML را برگردانده و تجزیه کنید.
-
AndroidManifest.xml را برای افزودن اجازه ی اینترنت تغییر دهید.
-
برنامه را اجرا کنید و یک دستگاه اجرایی اندروید انتخاب کرده و برنامه را روی آن نصب کنید و نتایج را بررسی کنید.
در زیر محتوای تغییر یافته ی فایل MainActivity.java را مشاهده می کنید.
package com.PRG.xmlparser;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
com.PRG.xmlparser
public class MainActivity extends ActionBarActivity {
EditText ed1,ed2,ed3,ed4,ed5;
private String url1 = "http://api.openweathermap.org/data/2.5/weather?q=";
private String url2 = "&mode=xml";
private HandleXML obj;
Button b1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
ed1=(EditText)findViewById(R.id.editText);
ed2=(EditText)findViewById(R.id.editText2);
ed3=(EditText)findViewById(R.id.editText3);
ed4=(EditText)findViewById(R.id.editText4);
ed5=(EditText)findViewById(R.id.editText5);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = ed1.getText().toString();
String finalUrl = url1 + url + url2;
ed2.setText(finalUrl);
obj = new HandleXML(finalUrl);
obj.fetchXML();
while(obj.parsingComplete);
ed2.setText(obj.getCountry());
ed3.setText(obj.getTemperature());
ed4.setText(obj.getHumidity());
ed5.setText(obj.getPressure());
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
در اینجا محتوای src/com.PRG.xmlparser/HandleXML.java می باشد.
package com.PRG.xmlparser;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* Created by Sairamkrishna on 4/11/2015.
*/
public class HandleXML {
private String country = "county";
private String temperature = "temperature";
private String humidity = "humidity";
private String pressure = "pressure";
private String urlString = null;
private XmlPullParserFactory xmlFactoryObject;
public volatile boolean parsingComplete = true;
public HandleXML(String url){
this.urlString = url;
}
public String getCountry(){
return country;
}
public String getTemperature(){
return temperature;
}
public String getHumidity(){
return humidity;
}
public String getPressure(){
return pressure;
}
public void parseXMLAndStoreIt(XmlPullParser myParser) {
int event;
String text=null;
try {
event = myParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.TEXT:
text = myParser.getText();
break;
case XmlPullParser.END_TAG:
if(name.equals("country")){
country = text;
}
else if(name.equals("humidity")){
humidity = myParser.getAttributeValue(null,"value");
}
else if(name.equals("pressure")){
pressure = myParser.getAttributeValue(null,"value");
}
else if(name.equals("temperature")){
temperature = myParser.getAttributeValue(null,"value");
}
else{
}
break;
}
event = myParser.next();
}
parsingComplete = false;
}
catch (Exception e) {
e.printStackTrace();
}
}
public void fetchXML(){
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
InputStream stream = conn.getInputStream();
xmlFactoryObject = XmlPullParserFactory.newInstance();
XmlPullParser myparser = xmlFactoryObject.newPullParser();
myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
myparser.setInput(stream, null);
parseXMLAndStoreIt(myparser);
stream.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
}
در اینجا محتوای تغییریافته ی xml مربوط به res/layout/activity_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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="XML Fetch"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials Point"
android:id="@+id/textView2"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:textSize="35dp"
android:textColor="#ff16ff01" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:hint="Location"
android:layout_below="@+id/textView2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="61dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Weather "
android:id="@+id/button"
android:layout_below="@+id/editText"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:layout_below="@+id/button"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/editText"
android:layout_alignEnd="@+id/editText"
android:text="Currency" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText3"
android:layout_below="@+id/editText2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:text="Temp" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText4"
android:layout_below="@+id/editText3"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/editText3"
android:layout_alignEnd="@+id/editText3"
android:text="Humidity" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText5"
android:layout_below="@+id/editText4"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:text="Pressure" />
</RelativeLayout>
در اینجا محتوای فایل AndroidManifest.xml را مشاهده می کنید.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.PRG.xmlparser" >
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
اجازه بدهید برنامه ی XMLParser خود را که تازه تغییر یافته، اجرا کنیم. فرض می کنیم که شما در هنگام انجام تنظیمات محیط AVD خود را ایجاد کرده اید. برای اجرای برنامه از Eclipse یکی از فایل های فعالیت پروژه ی خود را باز کنید و روی آیکنRun تولبار کلیک کنید.
کاری که اکنون باید انجام دهید وارد کردن هر موقعیتی در فیلد location می باشد. به عنوان مثال من india را وارد کردم. پس از وارد کردن مکان، دکمه ی weather را فشار دهید که صفحه ی زیر روی AVD نممایش داده خواهد شد.
وقتی دکمه ی weather را فشار می دهید برنامه با Google Weather API تماس برقرار خواهد کرد و موقعیت ضروری فایل XML شما را درخواست کرده و آن را تجزیه می کند.
توجه داشته باشید که این دما به کلوین می باشد و برای قابل درک بودن فرمت آن، باید دما را به سلسیوس تبدیل کنید.
- نوشته شده توسط سعید نوشادی
- بازدید: 6076
دیدگاهها
با سلام و تشکر از سایت خوبتون
با عرض معذرت منظورتون از این توضیحات پایین چیه ؟؟ من متوجه نمیشم
ممنون میشم راهنمایی کنید
فایل src/MainActivit y.java را برای افزودن کد لازم تغییر دهید.
res/layout/activity_main را برای افزودن مولفه های XML مربوطه تغییر دهید.
res/values/string.xml را برای افزودن مولفه های رشته ی لازم تغییر دهید.
با سلام
توی اکلیپس در منوی سمت چپ که فولدر های پروژتون اونجا هستن باید به اون آدرس ها برید
مثلا منظور از src/MainActivit y.java یعنی به فولدر src برید و یه اکتیویتی با نام MainActivity.ja va اونجا هست که باید محتویات اون رو تغییر بدید.بقیه یموارد هم به همین صورته
موفق باشید