کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش تجزیه کننده ی XML

 

clip_image001

دوره آموزش برنامه نویسی اندروید

کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.

 

آموزش تجزیه کننده ی    XML

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 را تعریف می کند.
Sr.No

  

مولفه و توضیح  

  

1  

  

Prolog

یک فایل xml با یک مقدمه(prolog) شروع می شود. اولین خط که شامل اطلاعاتی در مورد یک فایل است، مقدمه نامیده می شود.

2  

  

Events

یک فایل xml دارای رویدادهای بسیاری می باشد. یک رویداد می تواند چیزی شبیه این باشد: شروع داکیومنت، پایان داکیومنت، شروع tag، پایان tag و متن و غیره.

3  

  

Text

علاوه با رویداد ها و tag ها، یک فایل xml دارای یک متن ساده نیز می باشد. به عنوان مثال GB یک متن در country tag می باشد.

4  

  

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 توسط این گروه ارائه می شوند که در زیر لیست آنها را می بینید.

Sr.No  

  

Method & description  

  

1  

  

getAttributeCount()

این روش تعداد ویژگی های start tag موجود را گزارش می دهد.

2  

  

getAttributeName(int index)

این روش نام ویژگی مشخص شده توسط شاخص مقدار را گزارش می دهد.

3  

  

getColumnNumber()

این روش تعداد گزارش های مربوط به تعداد ستون های موجود را گزارش می دهد، شروع از 0.

4  

  

getDepth()

این روش آخرین عمق مربوط به عنصر را گزارش می دهد.

5  

  

getLineNumber()

این روش تعداد آخرین خطوط را گزارش می دهد، شروع از عدد 1.

6  

  

getNamespace()

این روش URI فضانام های مربوط به آخرین عنصر را گزارش می دهد.

7  

  

getPrefix()

این روش پیشوند مربوط به عنصر موجود را گزارش می دهد.

8  

  

getName()

این روش نام tag را گزارش می دهد.

9

 

getText()

این روش متن مربوط به عنصر خاص را گزارش می دهد.

10

 

isWhitespace()

این روش چک می کند که آیا رویداد TEXT فعلی فقط دارای کاراکنرهای فضای سفید می باشد.

 

مثال

در اینجا مثالی را می بینید که استفاده از گروه MLPullParser را توضیح می دهد. این مثال یک برنامه ی آب هوایی پایه ایجاد می کند که به شما اجازه می دهد تا XML را از طریق google weather api تجزیه کنید و نتایج را نشان می دهد.

برای انجام این مثال باید آن را روی یک دستگاه واقعی یا یک emulator اجرا کنید.

Steps

Description

1

 

برای ایجاد یک برنامه ی اندروید از Eclipse IDE استفاده خواهید کرد و آن را با عنوان  XMLParser  تحت بسته ی com.example.xmlparserنام گذاری کنید. زمان ایجاد این برنامه مطمئن شوید که Target SDK و Compile With در آخرین ورژن Android SDK هستند تا از سطوح بالاتر API استفاده کنید.

2

فایل src/MainActivity.java را برای افزودن کد لازم تغییر دهید.

3

res/layout/activity_main را برای افزودن مولفه های XML مربوطه تغییر دهید.

4

res/values/string.xml را برای افزودن مولفه های رشته ی لازم تغییر دهید.

5

یک فایل جاوای جدید تحت src/HandleXML.java ایجاد کنید تا داده XML را برگردانده و تجزیه کنید.

6

AndroidManifest.xml را برای افزودن اجازه ی اینترنت تغییر دهید.

7

برنامه را اجرا کنید و یک دستگاه اجرایی اندروید انتخاب کرده و برنامه را روی آن نصب کنید و نتایج را بررسی کنید.

 

در زیر محتوای تغییر یافته ی فایل فعالیت اصلی را مشاهده می کنید.

src/com.example.xmlparser/MainActivity.java.

package com.example.sairamkrishna.myapplication;
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.example.sairamkrishna.myapplication

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.example.xmlparser/HandleXML.java می باشد.

package com.example.sairamkrishna.myapplication;
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.example.sairamkrishna.myapplication" >

  <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  تولبار کلیک کنید. Eclipse برنامه را روی AVD شما نصب خواهد کرد و اگر همه چیز در مورد تنظیمات و برنامه درست پیش رفته باشد، پنجره ی emulator زیر را نمایش خواهد داد.

کاری که اکنون باید انجام دهید وارد کردن هر موقعیتی در فیلد location می باشد. به عنوان مثال من لندن را وارد کردم. پس از وارد کردن مکان، دکمه ی weather را فشار دهید که صفحه ی زیر روی AVD نممایش داده خواهد شد.

  وقتی دکمه ی weather را فشار می دهید برنامه با Google Weather API تماس برقرار خواهد کرد و موقعیت ضروری فایل XML شما را درخواست کرده و آن را تجزیه می کند. در مورد لندن صفحه ی زیر گزارش داده خواهد شد.

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

1394/07/27 7823 2036
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...