কম্পিউটার টিউটোরিয়াল

পাইথনে ElementTree XML API

এক্সটেনসিবল মার্কআপ ল্যাঙ্গুয়েজ (XML) HTML-এর মত একটি মার্কআপ ল্যাঙ্গুয়েজ। এটি পোর্টেবল এবং ছোট থেকে মidium পরিমাণের ডেটা SQL ডাটাবেস ছাড়া হ্যান্ডেল করার জন্য উপযোগী।

পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতে xml প্যাকেজ রয়েছে। এই প্যাকেজে ElementTree মডিউল রয়েছে। এটি একটি সিম্পল এবং লাইটওয়েট XML প্রসেসর API।

XML একটি ট্রি-লাইক হায়ারার্কিক্যাল ডেটা ফরম্যাট। এই মডিউলের 'ElementTree' পুরো XML ডকুমেন্টকে একটি ট্রি হিসেবে বিবেচনা করে। 'Element' ক্লাস এই ট্রিতে একটি একক নোডকে রিপ্রেজেন্ট করে। XML ফাইলগুলোর রিডিং এবং রাইটিং অপারেশন ElementTree লেভেলে করা হয়। একটি একক XML এলিমেন্ট এবং এর সাব-এলিমেন্টের সাথে ইন্টারঅ্যাকশন Element লেভেলে করা হয়।

XML ফাইল তৈরি করা

ট্রি হলো রুট দিয়ে শুরু হওয়া এলিমেন্টের একটি হায়ারার্কিক্যাল স্ট্রাকচার। প্রতিটি এলিমেন্ট এই মডিউলের Element() ফাংশন ব্যবহার করে তৈরি করা হয়।

import xml.etree.ElementTree as et
e = et.Element('name')

প্রতিটি এলিমেন্ট একটি ট্যাগ এবং attrib অ্যাট্রিবিউট দ্বারা চরিত্রিত হয় যা একটি ডিক্ট অবজেক্ট। ট্রির শুরুতের এলিমেন্টের জন্য attrib একটি খালি ডিকশনারি।

>>> root = xml.Element('employees')
>>> root.tag
'emploees'
>>> root.attrib
{}

আপনি এখন রুট এলিমেন্টের অধীনে যোগ করার জন্য এক বা একাধিক চাইল্ড এলিমেন্ট সেট আপ করতে পারেন। প্রতিটি চাইল্ডের এক বা একাধিক সাব-এলিমেন্ট থাকতে পারে। সাব-এলিমেন্ট যোগ করতে Subelement() ফাংশন ব্যবহার করুন এবং এর টেক্সট অ্যাট্রিবিউট সংজ্ঞায়িত করুন।

child = xml.Element("employee")
nm = xml.SubElement(child, "name")
nm.text = student.get('name')
age = xml.SubElement(child, "salary")
age.text = str(student.get('salary'))

প্রতিটি চাইল্ড রুটে append() ফাংশন দ্বারা যোগ করা হয়:

root.append(child)

প্রয়োজনীয় সংখ্যক চাইল্ড এলিমেন্ট যোগ করার পর, elementTree() ফাংশন ব্যবহার করে একটি ট্রি অবজেক্ট তৈরি করুন:

tree = et.ElementTree(root)

সম্পূর্ণ ট্রি স্ট্রাকচার tree অবজেক্টের write() ফাংশন দ্বারা একটি বাইনারি ফাইলে লেখা হয়:

f = open('employees.xml', "wb")
tree.write(f)

নিচের উদাহরণে ডিকশনারি আইটেমের একটি তালিকা থেকে ট্রি তৈরি করা হয়েছে। প্রতিটি ডিকশনারি আইটেম একটি স্টুডেন্ট ডেটা স্ট্রাকচার বর্ণনা করে এমন কী-ভ্যালু পেয়ার ধারণ করে। এইভাবে তৈরি ট্রি 'myfile.xml'-এ লেখা হয়েছে।

import xml.etree.ElementTree as et
employees = [{'name': 'aaa', 'age': 21, 'sal': 5000}, {'name': 'xyz', 'age': 22, 'sal': 6000}]
root = et.Element("employees")
for employee in employees:
    child = xml.Element("employee")
    root.append(child)
    nm = xml.SubElement(child, "name")
    nm.text = student.get('name')
    age = xml.SubElement(child, "age")
    age.text = str(student.get('age'))
    sal = xml.SubElement(child, "sal")
    sal.text = str(student.get('sal'))
tree = et.ElementTree(root)
with open('employees.xml', "wb") as fh:
    tree.write(fh)

'myfile.xml' বর্তমান ওয়ার্কিং ডিরেক্টরিতে সংরক্ষিত হয়।

<employees><employee><name>aaa</name><age>21</age><sal>5000</sal></employee><employee><name>xyz</name><age>22</age><sal>60</sal></employee></employee>

XML ফাইল পার্স করা

আসুন উপরের উদাহরণে তৈরি 'myfile.xml'-কে পढ़ি ফেরি। এই উদ্দেশ্যে ElementTree মডিউলের নিচের ফাংশনগুলো ব্যবহার করা হবে:

ElementTree() এই ফাংশন এলিমেন্টের হায়ারার্কিক্যাল স্ট্রাকচারকে একটি ট্রি অবজেক্টে পড়তে ওভারলোড করা হয়েছে।

tree = et.ElementTree(file='students.xml')

getroot() এই ফাংশন ট্রির রুট এলিমেন্ট রিটার্ন করে।

root = tree.getroot()

getchildren() এই ফাংশন একটি এলিমেন্টের এক লেভেল নিচের সাব-এলিমেন্টের তালিকা রিটার্ন করে।

children = root.getchildren()

নিচের উদাহরণে, 'myfile.xml'-এর এলিমেন্ট এবং সাব-এলিমেন্টগুলো পার্স করে ডিকশনারি আইটেমের একটি তালিকা তৈরি করা হয়েছে।

import xml.etree.ElementTree as et
tree = et.ElementTree(file='employees.xml')
root = tree.getroot()
students = []
children = root.getchildren()
for child in children:
    employee = {}
    pairs = child.getchildren()
    for pair in pairs:
        employee[pair.tag] = pair.text
    employees.append(student)
print(employees)

আউটপুট

[{'name': 'aaa', 'age': '21', 'sal': '5000'}, {'name': 'xyz', 'age': '22', 'sal': '6000'}]

XML ফাইল মডিফাই করা

আমরা Element-এর iter() ফাংশন ব্যবহার করব। এটি কারেন্ট এলিমেন্টকে রুট ধরে দেওয়া ট্যাগের জন্য একটি ট্রি ইটেরেটর তৈরি করে। ইটেরেটর এই এলিমেন্ট এবং এর নিচের সকল এলিমেন্টের ওপর ডকুমেন্ট (ডেপথ ফার্স্ট) অর্ডারে ইটেরেট করে।

আসুন 'sal' সাব-এলিমেন্টের সবগুলোর জন্য ইটেরেটর বানাই এবং প্রতিটি sal ট্যাগের টেক্সট ১০০ বাড়াই।

import xml.etree.ElementTree as et
tree = et.ElementTree(file='students.xml')
root = tree.getroot()
for x in root.iter('sal'):
    s = int(x.text)
    s = s + 100
    x.text = str(s)
with open("employees.xml", "wb") as fh:
    tree.write(fh)

আমাদের 'employees.xml' এখন অনুযায়ী মডিফাই হবে।

আমরা একটি নির্দিষ্ট কী-এর মান আপডেট করতে set()ও ব্যবহার করতে পারি।

x.set(marks, str(mark))
  1. পাইথনে বাইনারি ট্রি-র সর্বোচ্চ পারফেক্ট সাবট্রির আকার নির্ণয়

  2. পাইথনে সিমেট্রিক ট্রি যাচাই (Symmetric Tree)

  3. পাইথনে XML পার্সিং: ElementTree API ব্যবহার করে XML পড়া, লিখা এবং মডিফাই করা

  4. পাইথন ডিবাগার (pdb)