Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

API ElementTree สำหรับ XML ใน Python

ภาษามาร์กอัพที่ขยายได้ (XML) เป็นภาษามาร์กอัพที่คล้ายกับ HTML เป็นแบบพกพาและมีประโยชน์สำหรับจัดการข้อมูลปริมาณน้อยถึงปานกลางโดยไม่ต้องใช้ฐานข้อมูล SQL

ไลบรารีมาตรฐานของ Python มีแพ็กเกจ xml ซึ่งมีโมดูล ElementTree นี่คือ API ตัวประมวลผล XML ที่เรียบง่ายและเบา

XML เป็นรูปแบบข้อมูลแบบลำดับชั้นคล้ายต้นไม้ 'ElementTree' ในโมดูลนี้จัดการเอกสาร XML ทั้งหมดเป็นต้นไม้ คลาส 'Element' แทนโหนดเดี่ยวในต้นไม้นี้ การอ่านและเขียนไฟล์ XML ทำที่ระดับ ElementTree การโต้ตอบกับองค์ประกอบ XML เดียวและองค์ประกอบย่อยทำที่ระดับ Element

การสร้างไฟล์ XML

ต้นไม้เป็นโครงสร้างลำดับชั้นขององค์ประกอบเริ่มจากราก (root) ตามด้วยองค์ประกอบอื่นๆ แต่ละองค์ประกอบสร้างโดยใช้ฟังก์ชัน Element() ของโมดูลนี้:

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

แต่ละองค์ประกอบมีลักษณะเฉพาะโดยแท็ก (tag) และแอตทริบิวต์ attrib ซึ่งเป็นอ็อบเจ็กต์ dict สำหรับองค์ประกอบเริ่มต้นของต้นไม้ attrib เป็นดิกชันนารีว่าง:

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

ตอนนี้คุณสามารถตั้งค่าองค์ประกอบลูก (child elements) หนึ่งหรือมากกว่าเพื่อเพิ่มใต้องค์ประกอบราก แต่ละลูกอาจมีหนึ่งหรือหลายสับอิลิเมนต์ เพิ่มโดยใช้ฟังก์ชัน SubElement() และกำหนดแอตทริบิวต์ text:

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()
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

เราจะใช้ฟังก์ชัน iter() ของ Element ฟังก์ชันนี้สร้างตัววนซ้ำ (iterator) ของต้นไม้สำหรับแท็กที่กำหนดด้วยองค์ประกอบปัจจุบันเป็นราก ตัววนซ้ำจะวนผ่านองค์ประกอบนี้และองค์ประกอบทั้งหมดด้านล่าง โดยลำดับเอกสาร (depth first)

ลองสร้างตัววนซ้ำสำหรับทุกสับอิลิเมนต์ '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))