एक्स्टेंसिबल मार्कअप लैंग्वेज (XML) HTML की तरह एक मार्कअप लैंग्वेज है। यह पोर्टेबल है और छोटी से मध्यम मात्रा में डेटा को किसी 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
'employees'
>>> 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)
पूरी ट्री संरचना को ट्री ऑब्जेक्ट के 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></employees>
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()
employees = []
children = root.getchildren()
for child in children:
employee = {}
pairs = child.getchildren()
for pair in pairs:
employee[pair.tag] = pair.text
employees.append(employee)
print(employees)
आउटपुट
[{'name': 'aaa', 'age': '21', 'sal': '5000'}, {'name': 'xyz', 'age': '22', 'sal': '6000'}]
XML फ़ाइल संशोधित करना
हम Element के iter() फ़ंक्शन का उपयोग करेंगे। यह दिए गए टैग के लिए करंट एलिमेंट को रूट मानकर एक ट्री इटरेटर बनाता है। इटरेटर इस एलिमेंट और इसके नीचे के सभी एलिमेंट्स पर डॉक्यूमेंट (डेप्थ फर्स्ट) क्रम में पुनरावृति करता है।
आइए सभी 'marks' सब-एलिमेंट्स के लिए इटरेटर बनाएं और प्रत्येक sal टैग के टेक्स्ट को 100 से बढ़ाएं।
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))