Ngôn ngữ đánh dấu mở rộng (XML) là một ngôn ngữ đánh dấu rất giống HTML. Nó di động và hữu ích để xử lý lượng dữ liệu nhỏ đến trung bình mà không cần cơ sở dữ liệu SQL.
Thư viện chuẩn của Python chứa gói xml. Gói này có mô-đun ElementTree. Đây là một API xử lý XML đơn giản và nhẹ.
XML là định dạng dữ liệu phân cấp dạng cây. ElementTree trong mô-đun này coi toàn bộ tài liệu XML như một cây. Lớp Element đại diện cho một nút đơn trong cây này. Các thao tác đọc và ghi trên file XML được thực hiện ở cấp độ ElementTree. Tương tác với một phần tử XML đơn lẻ và các phần tử con của nó được thực hiện ở cấp độ Element.
Tạo file XML
Cây là cấu trúc phân cấp của các phần tử bắt đầu từ gốc theo sau bởi các phần tử khác. Mỗi phần tử được tạo bằng hàm Element() của mô-đun này.
import xml.etree.ElementTree as et
e = et.Element('name')Mỗi phần tử được đặc trưng bởi một thẻ (tag) và thuộc tính attrib là một đối tượng dict. Đối với phần tử bắt đầu của cây, attrib là một từ điển rỗng.
>>> root = xml.Element('employees')
>>> root.tag
'employees'
>>> root.attrib
{}Bây giờ bạn có thể thiết lập một hoặc nhiều phần tử con để thêm dưới phần tử gốc. Mỗi phần tử con có thể có một hoặc nhiều phần tử con cháu. Thêm chúng bằng hàm SubElement() và định nghĩa thuộc tính text của nó.
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'))Mỗi phần tử con được thêm vào gốc bằng hàm append():
root.append(child)
Sau khi thêm số lượng phần tử con cần thiết, xây dựng đối tượng cây bằng hàm ElementTree():
tree = et.ElementTree(root)
Cấu trúc cây toàn bộ được ghi vào file nhị phân bằng hàm write() của đối tượng tree:
f = open('employees.xml', "wb")
tree.write(f)Trong ví dụ sau, cây được xây dựng từ danh sách các mục từ điển. Mỗi mục từ điển chứa các cặp khóa-giá trị mô tả cấu trúc dữ liệu sinh viên. Cây được xây dựng được ghi vào employees.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)File employees.xml được lưu trong thư mục làm việc hiện tại.
<employees><employee><name>aaa</name><age>21</age><sal>5000</sal></employee><employee><name>xyz</name><age>22</age><sal>60</sal></employee></employees>
Phân tích file XML
Hãy đọc lại employees.xml được tạo ở ví dụ trên. Các hàm sau trong mô-đun ElementTree sẽ được sử dụng:
ElementTree() Hàm này được nạp chồng để đọc cấu trúc phân cấp các phần tử vào đối tượng tree.
tree = et.ElementTree(file='employees.xml')
getroot() Hàm này trả về phần tử gốc của cây.
root = tree.getroot()
getchildren() Hàm này trả về danh sách các phần tử con cấp độ thấp hơn một cấp của một phần tử.
children = root.getchildren()
Trong ví dụ sau, các phần tử và phần tử con của employees.xml được phân tích thành danh sách các mục từ điển.
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)Đầu ra
[{'name': 'aaa', 'age': '21', 'sal': '5000'}, {'name': 'xyz', 'age': '22', 'sal': '6000'}]Sửa đổi file XML
Chúng ta sẽ dùng hàm iter() của Element. Nó tạo một trình lặp cây cho thẻ cho trước với phần tử hiện tại làm gốc. Trình lặp lặp qua phần tử này và tất cả các phần tử bên dưới nó, theo thứ tự tài liệu (sâu trước).
Hãy xây dựng trình lặp cho tất cả các phần tử con sal và tăng giá trị text của mỗi thẻ sal lên 100.
import xml.etree.ElementTree as et
tree = et.ElementTree(file='employees.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)File employees.xml sẽ được sửa đổi tương ứng.
Chúng ta cũng có thể dùng set() để cập nhật giá trị của một khóa nhất định.
x.set('sal', str(s))