الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية الحصول على البيانات من ملف الـ XML فى الاندرويد

بدأه Mahmoud Kelany في 11 أكتوبر 2012 · 0 رد · 2,329 مشاهدة · في Android
مشاركة: واتساب X فيسبوك تيليجرام
#1

السلام عليكم ورحمه الله وبركاته

ان شاء الله اليوم سوف نتطرق لكيفية التعامل مع الـ XML وكيفيه استخراج البيانات من داخله

قد قومت ببناء ملف XML بسيط فى هذا الرابط

http://jkelany.users...droid_users.xml

ومحتواه كالتالى

<android_users>
	<account_info>
		<name data="Mahmoud Kelany"/>
		<job  data="Java Developer"/>
		<address data="Sharqia , Egypt"/>
	</account_info>
	<account_info>
		<name data="Ahmed Ayashi"/>
		<job  data="Mobile Developer"/>
		<address data="Egypt"/>
	</account_info>

	<account_info>
		<name data="Mohamed Bayoumi"/>
		<job  data="SW Developer"/>
		<address data="Zagazig , Egypt"/>
	</account_info>
</android_users>

ملفات الـ XML عباره عن Tags

ولكل Tag مجموعه من الـ Attributes

ولكل Attribute قيمة

فمثلا

<name data="Mahmoud Kelany"/>

هنا الـ name عباره عن Tag

والـ data عباره عن Attribute وقيمتها هو الاسم Mahmoud Kelany

فبتحليل ملف الـ XML وجدنا انه عباره عن ملف لبيانات مستخدمين لدى كل مستخدم الاسم والوظيفة والعنوان

قومت بعمل فئة bean تحتوى على مستخدم لكى يتم استخدامها بعد ذلك فى استخراج البيانات

package com.jkelany.xml;

public class User {
	private String name;
	private String job;
	private String address;

	public User(String name, String job, String address) {
		this.name = name;
		this.job = job;
		this.address = address;
	}

	public User() {
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return name + " is a " + job + "\nLives in " + address + "\n\n";
	}
}

فلاستخراج البيانات من ملف الـ XML فهناك فئات تتعامل مع ذلك

SAXParserFactory parserFactory = SAXParserFactory.newInstance();
SAXParser parser = parserFactory.newSAXParser();
XMLReader xmlReader = parser.getXMLReader();

فكلمة SAX هى اختصارا لـ Simple API XML

عن طريق الـSAXParserFactory نقوم بعمل باخذ نسخه منه عن طريق الداله newInstance

وبعدها نقوم باستدعاء الداله newSAXParser التى تقوم بانشاء كائن من النوع SAXParser

الذى يمكننا من الحصول على XMLReader لقراءة ملف الـ XML

قبل ان نقوم بقراءة الملف لابد من تعين الـ Handler الخاص باستخلاص البيانات من الـ Tags

وهو ما قومت بالفعل عملة فى فئة خارجيه XMLHandling والتى ترث من الـ DefaultHandler

سوف نقوم بشرح ما بداخلها ولكن دعنا نكمل بعد ان نقوم بعمل تعيين الـ Handler نقوم بعمل parse او قراءه لملف الـ XML واستخراج البيانات من داخله

XMLHandling handler = new XMLHandling();
			xmlReader.setContentHandler(handler);
			xmlReader.parse(new InputSource(new URL(USERS_URL).openStream()));

حيث نقوم باعطائها كائن من النوع InputSource الذى يأخذ كائن من نوع URL وهو العنوان الخاص برابط ملف الـ XML ومن ثم نستدعى الداله openStream

بعد ذلك فى الفئه XMLHandling لدينا داله تقوم بجلب البيانات getUsersData وهى ما تعود لنا ببيانات المستخدمين فى صوره مصفوفه User[] نستعملها كيفما نشاء بعد ذلك

نأتى بعد ذلك للفئة XMLHandling المسئولة عن استخراج البيانات فهى فئه ترث من الـ DefaultHandler

ثم نقوم بعمل اعادة بناء الداله startElement

والتى تحتوى على بعض المدخلات من اهمها بالنسبه لنا هو localName وهو ما يعبر عن اسم الـ Tag

والـ attributes وهى القيم التى تحتويها كل Tag

من ثم نقوم بعمل if...else لمعرفه هل هذا الـ Tag هو خاص بالـ name , job , address

ومن ثم نقوم بعمل فئه جديده من الـ User واعطائها البيانات وتخزينها فى الـ usersList

@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		String data = attributes.getValue("data");
		if (localName.equals("name")) {
			user.setName(data);
		} else if (localName.equals("job")) {
			user.setJob(data);
		} else if (localName.equals("address")) {
			user.setAddress(data);
		}
		if (user.getAddress() != null) {
			usersList.add(user);
			user = new User();
		}
	}

وبعد ذلك عند استدعاء الداله getUsersData

تقوم هى بتحويل الـ list الى مصفوفه

public User[] getUsersData() {
		return usersList.toArray(new User[usersList.size()]);
	}

وبهذا نكون قد انتهينا من التعامل مع ملفات الـ XML

الكود كاملا

package com.jkelany.xml;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class XMLHandling extends DefaultHandler {
	private User user;
	private ArrayList<User> usersList;

	public XMLHandling() {
		user = new User();
		usersList = new ArrayList<User>();
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		String data = attributes.getValue("data");
		if (localName.equals("name")) {
			user.setName(data);
		} else if (localName.equals("job")) {
			user.setJob(data);
		} else if (localName.equals("address")) {
			user.setAddress(data);
		}
		if (user.getAddress() != null) {
			usersList.add(user);
			user = new User();
		}
	}

	public User[] getUsersData() {
		return usersList.toArray(new User[usersList.size()]);
	}
}

package com.jkelany.xml;

import java.net.URL;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class XMLUsersActivity extends Activity {
	private TextView usersTextView;
	private final String USERS_URL = "http://jkelany.users.sourceforge.net/android_users.xml";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		usersTextView = (TextView) findViewById(R.id.tv_users);
		try {
			SAXParserFactory parserFactory = SAXParserFactory.newInstance();
			SAXParser parser = parserFactory.newSAXParser();
			XMLReader xmlReader = parser.getXMLReader();
			XMLHandling handler = new XMLHandling();
			xmlReader.setContentHandler(handler);
			xmlReader.parse(new InputSource(new URL(USERS_URL).openStream()));

			User[] users = handler.getUsersData();
			String rs = "";
			for (int i = 0; i < users.length; i++) {
				rs += users;
			}
			usersTextView.setText(rs);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

صورة من عملية التشغيل

post-217802-050696800 1349909220_thumb.p

لتحميل المشروع

TestXMLParser.zip

بالتوفيق ان شاء الله

المرفقات
device-2012-10-11-004638.png

Software Developer
Mahmoudkelany.com


 

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…