سبد (0)

آموزش 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 شما را درخواست کرده و آن را تجزیه می کند.

  توجه داشته باشید که این دما به کلوین می باشد و برای قابل درک بودن فرمت آن، باید دما را به سلسیوس تبدیل کنید.

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه