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

ElementTree XML API ใน Python


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

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

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

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

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

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

แต่ละองค์ประกอบมีลักษณะเฉพาะด้วยแท็กและแอตทริบิวต์ attrib ซึ่งเป็นอ็อบเจกต์ dict สำหรับองค์ประกอบเริ่มต้นของ tree 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)

โครงสร้างต้นไม้ทั้งหมดถูกเขียนลงในไฟล์ไบนารีโดยฟังก์ชัน 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

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

ให้เราสร้างตัววนซ้ำสำหรับองค์ประกอบย่อย 'เครื่องหมาย' ทั้งหมดและเพิ่มข้อความของแต่ละแท็ก 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))