السلام عليكم ورحمه الله وبركاته
ان شاء الله اليوم سوف نتطرق لكيفية التعامل مع الـ 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();
}
}
}صورة من عملية التشغيل
لتحميل المشروع
بالتوفيق ان شاء الله