কিভাবে XML parse করা যায়, তা দেখব। এ টিউটোরিয়ালে আমরা W3school থেকে পাওয়া সিম্পল একটা XML ফাইল ব্যবহার করব। যেখানে সকালের খাবারের আইটেম গুলোর কিছু তথ্য দেওয়া আছে। ফাইলটি দেখা যাবে এখানে ক্লিক করে। ঐটা ডাউনলোড করে asset ফোল্ডারে রাখব।
এখানে সকালের খাবারের একটা তালিকা, তাদের দাম এবং তথ্য দেওয়া আছে। আমরা এ তথ্য গুলো পার্স করব এবং অ্যাপের যে কোন একটা ভিউতে দেখাবো। এখানে যেহেতু খাবারের তথ্য রয়েছে, আমরা Food নামে একটি ক্লাস তৈরি করে নিব। যেখানে তিনটি ফিল্ড রয়েছে। name, price and description. এ ফিল্ড গুলোর getter and setter তৈরি করে নিব, যেন Food এর অবজেক্ট তৈরি করলে ফিল্ড গুলো এক্সেস করতে পারি।
Food.java
public class Food { private String name; private String price; private String description; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public String toString() { return " Name = " + name + "\n Price = " + price + "\n Description = "+description; } }
আমাদের 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" tools:context=".MainActivity" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </RelativeLayout>
MainActivity.java এখানে আমরা assets ফোল্ডার থেকে xml ফাইলটা রিড করে XmlParser ক্লাসের মধ্যে থাকা parser মেথডে পাঠিয়েছি। সেখান থেকে xml পার্স করে আমারের একটা অ্যারে লিস্ট রিটার্ন করেছে। ঐ অ্যারে লিস্ট পরবর্তীতে আমরা ArrayAdapter এর মাধ্যমে লিস্টভিউতে যুক্ত করেছি। অ্যান্ড্রয়েড লিস্ট ভিউ সম্পর্কে বিস্তারিত জানতে এ লেখাটা দেখা যেতে পারেঃ অ্যান্ড্রয়েড লিস্ট ভিউ – Android ListView
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import java.io.IOException; import java.io.InputStream; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = (ListView) findViewById(R.id.listView1); List<Food> foods = null; try { XmlParser parser = new XmlParser(); InputStream content = getAssets().open("food.xml"); foods = parser.parse(content); ArrayAdapter<Food> adapter =new ArrayAdapter<Food> (this,android.R.layout.simple_list_item_1, foods); listView.setAdapter(adapter); } catch (IOException e) {e.printStackTrace();} } }
XmlParser.java ক্লাসঃ
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public class XmlParser { private List<Food> foods= new ArrayList<Food>(); private Food food; private String text; public List<Food> parse(InputStream is) { try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser parser = factory.newPullParser(); parser.setInput(is, null); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { String tagname = parser.getName(); switch (eventType) { case XmlPullParser.START_TAG: if (tagname.equalsIgnoreCase("food")) { // create a new instance of food food = new Food(); } break; case XmlPullParser.TEXT: text = parser.getText(); break; case XmlPullParser.END_TAG: if (tagname.equalsIgnoreCase("food")) { // add food object to list foods.add(food); }else if (tagname.equalsIgnoreCase("name")) { food.setName(text); } else if (tagname.equalsIgnoreCase("price")) { food.setPrice(text); } else if (tagname.equalsIgnoreCase("description")) { food.setDescription(text); } break; default: break; } eventType = parser.next(); } } catch (XmlPullParserException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} return foods; } }
আউটপুট হবে নিচের মত করেঃ